मेरे पास उप-चर के साथ कार्यों का एक सेट है, जिनके नाम मैंने डेटा फ्रेम में रखे हैं:
A tibble: 8 x 3
AB PRP DUAL
<chr> <chr> <chr>
1 Combined_t2|t1_lag8 mean_RT_200_all dual_average_accuracy
2 Combined_abmag_t2_lag8_minus_lag3 mean_RT_1000_all mean_RT_dual
3 Combined_abmag_t2_1.0_minus_lag3 PRP Dual_cost
4 Combined_abwidth NA NA
5 Combined_abdepth NA NA
6 Combined_lag3vslag8_residuals NA NA
7 Combined_lag3vslag8_stdrdized_residuals NA NA
मैं इन परिवर्तनीय नामों को जोड़ना चाहता हूं, प्रत्येक कॉलम से एक, एक समय में दो सूची में। तो ऐसा दिखेगा:
"Combined_t2|t1_lag8" "mean_RT_200_all"
"Combined_t2|t1_lag8" "mean_RT_1000_all"
"Combined_t2|t1_lag8" "PRP"
...
"Combined_abwidth" "dual_average_accuracy"
"Combined_abwidth" "mean_RT_dual"
...
"PRP" "Dual_cost"
"PRP" "dual_average_accuracy"
...
मैंने "कॉम्बिन" फ़ंक्शन का प्रयास किया है, लेकिन ऐसा लगता है कि यह केवल सूचियों के लिए काम करता है, डेटा फ्रेम नहीं। कुछ 'फॉर' लूप भी आजमाए लेकिन कोई सफलता नहीं मिली।
0
Jay G
22 अक्टूबर 2020, 06:16
2 जवाब
सबसे बढ़िया उत्तर
यहां एक base
समाधान है जो सामान्य है (अधिक कॉलम तक स्केल)। आपके डेटा को कॉल करना dd
:
# Omit missing values - data isn't really rectangular
# and rows seem to have no meaning
# so a list is an appropriate structure
dd_list = lapply(dd, na.omit)
# generate all pairs of "columns" (now list items)
col_pairs = combn(seq_along(dd_list), 2)
# for each pair, use `expand.grid` to generate all combinations
# since the wanted result is a list of vectors, not a data frame
# we strip the names and convert to matrix
result = apply(col_pairs, MARGIN = 2, FUN = function(x) {
as.matrix(unname(do.call(expand.grid, args = dd_list[x])))
})
# bind the matrices together - this seems like a nice result to work with
result = do.call(rbind, result)
result
# [,1] [,2]
# [1,] "Combined_t2|t1_lag8" "mean_RT_200_all"
# [2,] "Combined_abmag_t2_lag8_minus_lag3" "mean_RT_200_all"
# [3,] "Combined_abmag_t2_1.0_minus_lag3" "mean_RT_200_all"
# [4,] "Combined_abwidth" "mean_RT_200_all"
# [5,] "Combined_abdepth" "mean_RT_200_all"
# [6,] "Combined_lag3vslag8_residuals" "mean_RT_200_all"
# [7,] "Combined_lag3vslag8_stdrdized_residuals" "mean_RT_200_all"
# [8,] "Combined_t2|t1_lag8" "mean_RT_1000_all"
# ...
# but if you really want a list we can `split` the matrix into
# individual rows:
split(result, 1:nrow(result))
# $`1`
# [1] "Combined_t2|t1_lag8" "mean_RT_200_all"
#
# $`2`
# [1] "Combined_abmag_t2_lag8_minus_lag3" "mean_RT_200_all"
#
# $`3`
# [1] "Combined_abmag_t2_1.0_minus_lag3" "mean_RT_200_all"
# ...
उपरोक्त इसे करने का फैंसी (और स्केलेबल) तरीका है - यह इस त्वरित और गंदे तरीके के बराबर है:
result = rbind(
expand.grid(x = na.omit(dd$AB), y = na.omit(dd$PRP)),
expand.grid(x = na.omit(dd$AB), y = na.omit(dd$DUAL)),
expand.grid(x = na.omit(dd$PRP), y = na.omit(dd$DUAL))
)
split(as.matrix(unname(result)), 1:nrow(result))
0
Gregor Thomas
22 अक्टूबर 2020, 06:44
मेरा समाधान:
- अपने इच्छित प्रत्येक कॉलम को "वैरिएबल" लेबल वाले कॉलम के साथ एक अलग डेटाफ़्रेम के रूप में सहेजें।
- पहले डेटाफ़्रेम में बढ़ती हुई विषम संख्याओं का एक कॉलम जोड़ें (प्रत्येक पंक्ति के लिए 1 से शुरू करें और 2 जोड़ें) और उस पंक्ति को "आईडी" लेबल करें।
- दूसरे डेटाफ़्रेम में बढ़ते हुए सम संख्याओं का एक कॉलम जोड़ें (२ से शुरू करें और प्रत्येक पंक्ति के लिए २ जोड़ें) और उस पंक्ति को "आईडी" लेबल करें।
tidyverse::bind_rows
का उपयोग करके दोनों डेटाफ़्रेम को संयोजित करें- "आईडी" के आधार पर छाँटने के लिए
tidyverse::arange
का प्रयोग करें। - केवल "वैरिएबल" लेबल वाले कॉलम को चुनने के लिए
tidyverse::select
का उपयोग करें। - परिणामी डेटाफ़्रेम को अपने अंतिम डेटाफ़्रेम के रूप में सहेजें।
त्वरित और गंदा समाधान। मुझे यकीन है कि वहाँ इसे करने के लिए कट्टर तरीके हैं। लेकिन जब तक वह जवाब नहीं आएगा तब तक यह काम हो जाएगा।
0
rrodriguezbarron
22 अक्टूबर 2020, 06:33