![](/img/trans.png)
[英]Assign column names of data.frames in a list of data.frames to other (Spatial) data.frames in a list of data.frames in R
[英]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.