मेरे पास उप-चर के साथ कार्यों का एक सेट है, जिनके नाम मैंने डेटा फ्रेम में रखे हैं:

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"
...

मैंने "कॉम्बिन" फ़ंक्शन का प्रयास किया है, लेकिन ऐसा लगता है कि यह केवल सूचियों के लिए काम करता है, डेटा फ्रेम नहीं। कुछ 'फॉर' लूप भी आजमाए लेकिन कोई सफलता नहीं मिली।

r
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. पहले डेटाफ़्रेम में बढ़ती हुई विषम संख्याओं का एक कॉलम जोड़ें (प्रत्येक पंक्ति के लिए 1 से शुरू करें और 2 जोड़ें) और उस पंक्ति को "आईडी" लेबल करें।
  3. दूसरे डेटाफ़्रेम में बढ़ते हुए सम संख्याओं का एक कॉलम जोड़ें (२ से शुरू करें और प्रत्येक पंक्ति के लिए २ जोड़ें) और उस पंक्ति को "आईडी" लेबल करें।
  4. tidyverse::bind_rows का उपयोग करके दोनों डेटाफ़्रेम को संयोजित करें
  5. "आईडी" के आधार पर छाँटने के लिए tidyverse::arange का प्रयोग करें।
  6. केवल "वैरिएबल" लेबल वाले कॉलम को चुनने के लिए tidyverse::select का उपयोग करें।
  7. परिणामी डेटाफ़्रेम को अपने अंतिम डेटाफ़्रेम के रूप में सहेजें।

त्वरित और गंदा समाधान। मुझे यकीन है कि वहाँ इसे करने के लिए कट्टर तरीके हैं। लेकिन जब तक वह जवाब नहीं आएगा तब तक यह काम हो जाएगा।

0
rrodriguezbarron 22 अक्टूबर 2020, 06:33