簡體   English   中英

通過通用列表元素名稱綁定data.frames列表

[英]cbind a list of data.frames by common list element names

我有以下data.frame (實際上要大得多):

df <- data.frame(
    question = c("Q1",  "Q1", "Q2_1", "Q2_1", "Q2_2", "Q2_2", "Q3_1", "Q3_2", "Q3_3", "Q3_4", "Q4"),
    label    = c("yes", "no", "yes",  "no",   "yes",  "no",   "yes",  "yes",  "yes",  "yes",  "x"),
    value   =  c("1",   "2",  "3",    "1",    "3",    "2",    "2",    "3",    "2",    "2",    "2")
)

我想按問題將其拆分為data.frames list

l <- split(df, df$question)
l
# $`Q1`
#   question label value
# 1       Q1   yes     1
# 2       Q1    no     2

# $Q2_1
#   question label value
# 3     Q2_1   yes     3
# 4     Q2_1    no     1

# $Q2_2
#   question label value
# 5     Q2_2   yes     3
# 6     Q2_2    no     2

# $Q3_1
#   question label value
# 7     Q3_1   yes     2

# $Q3_2
#   question label value
# 8     Q3_2   yes     3

# $Q3_3
#    question label value
# 9      Q3_3   yes     2
# 10     Q3_3   yes     2

# $Q4
#    question label value
# 11       Q4     x     2 

對於具有相同問題的列表名稱,我希望盡可能cbind它們cbind在一起。

最終結果將是:

l
    # $`Q1`
    #   question label value
    # 1       Q1   yes     1
    # 2       Q1    no     2

    # $`Q2`
    #   question label value question label value
    # 3     Q2_1   yes     3     Q2_2   yes     3
    # 4     Q2_1    no     1     Q2_2    no     2

    # $`Q3`
    #   question label value question label value question label value
    # 1     Q3_1   yes     2     Q3_2   yes     3     Q3_3   yes     2
    # 2     Q3_1   yes     2     Q3_2   yes     3     Q3_3   yes     2

    # $Q4
    #    question label value
    # 11       Q4     x     2   

理想情況下,尋找基礎或數據表解決方案。

我們可以使用兩個split

lapply(split(df, sub('_\\d+', '', df$question)),
       function(x) do.call(cbind, split(x, x$question, drop = TRUE)))

或帶map

library(tidyverse)

df %>%
  split(sub('_\\d+', '', .$question)) %>%
  map(~ split(., .$question, drop = TRUE) %>% 
        do.call(cbind, .))

輸出:

$Q1
  Q1.question Q1.label Q1.value
1          Q1      yes        1
2          Q1       no        2

$Q2
  Q2_1.question Q2_1.label Q2_1.value Q2_2.question Q2_2.label Q2_2.value
3          Q2_1        yes          3          Q2_2        yes          3
4          Q2_1         no          1          Q2_2         no          2

$Q3
  Q3_1.question Q3_1.label Q3_1.value Q3_2.question Q3_2.label Q3_2.value Q3_3.question Q3_3.label Q3_3.value
7          Q3_1        yes          2          Q3_2        yes          3          Q3_3        yes          2
  Q3_4.question Q3_4.label Q3_4.value
7          Q3_4        yes          2

$Q4
   Q4.question Q4.label Q4.value
11          Q4        x        2

一個基本選項是,首先通過僅保留每個列表的Q1,Q2,Q3 ...來更改列表的names ,然后收集所有具有相似名稱的列表並將其cbind

names(l) <- sub("(Q\\d+)_.*", "\\1", names(l))
lapply(unique(names(l)), function(x) do.call(cbind, l[names(l) == x]))


#[[1]]
#  Q1.question Q1.label Q1.value
#1          Q1      yes        1
#2          Q1       no        2

#[[2]]
#  Q2.question Q2.label Q2.value Q2.question Q2.label Q2.value
#3        Q2_1      yes        3        Q2_2      yes        3
#4        Q2_1       no        1        Q2_2       no        2

#[[3]]
#  Q3.question Q3.label Q3.value Q3.question Q3.label Q3.value Q3.question Q3.label
#7        Q3_1      yes        2        Q3_2      yes        3        Q3_3      yes
#  Q3.value Q3.question Q3.label Q3.value
#7        2        Q3_4      yes        2

#[[4]]
#   Q4.question Q4.label Q4.value
#11          Q4        x        2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM