我想将多个向量连接到一个数据框中,使用每个向量的名称来指导连接。
例如,如果我有向量x1,x2和x3:
sample(1:50,20)->x1; sample(1:50,20)->x2; sample(1:50,20)->x3
并且每个向量都有这样的名称:
nam <- paste("A",1:50, sep=""); names(x1)<-as.character(sample(nam,20)); names(x2)<-as.character(sample(nam,20)); names(x3)<-as.character(sample(nam,20))
我想生成一个数据框,其中第一列包含至少一个向量中使用的所有名称,其余列包含与每个向量关联的值,其中&#34; na&#34;当没有特定名称的值时。像这样:
A1 3 NA NA
A2 NA 4 5
A3 NA 3 NA
A4 NA 22 NA
....
这意味着名称A1仅与x1中的值(3)相关联,而不是与x2或x3中的值相关联。 A2仅与向量x2和x3中的值相关联,而不与x1中的值相关联。等
知道如何做到这一点吗?
非常感谢,
答案 0 :(得分:0)
我出现了类似的东西:
sort(unique(names(c(x1,x2,x3))))->nam2
cbind(nam2,x1[match(nam2,names(x1))],x2[match(nam2,names(x2))],x3[match(nam2,names(x3))])
我想在列表中为500多个向量执行此操作,是否知道如何将其放入lapply或类似的内容?
再次感谢
答案 1 :(得分:0)
创建数据框列表后考虑chain merge:
set.seed(61718) # PLACED AT VERY TOP FOR REPRODUCIBILITY
...
# USES ANY OBJECT WITH "x" IN NAME (HERE BEING c("x1", "x2", "x3"))
df_list <- lapply(ls(pattern="x"), function(d)
# CONVERTS VECTOR INTO DATAFRAME AND RENAMES COLUMNS
setNames(transform(data.frame(get(d)), letter=names(get(d))), c(d, "letter"))
)
# CHAIN MERGE
master_df <- Reduce(function(x,y) merge(x, y, by="letter", all=TRUE), df_list)
head(master_df, 10)
# letter x1 x2 x3
# 1 A11 50 12 5
# 2 A12 34 8 1
# 3 A13 3 31 NA
# 4 A14 42 7 NA
# 5 A17 27 44 41
# 6 A2 14 NA 46
# 7 A24 2 NA NA
# 8 A26 29 1 34
# 9 A30 23 4 38
# 10 A31 1 25 12
或者,如果Reduce
(迭代)运行速度太慢,请考虑构建相同的数据框列表,但每个都与 all_name_df 合并,然后cbind
所有结果一起:< / p>
all_name_df <- data.frame(letter=nam)
df_list <- lapply(c("x1", "x2", "x3"), function(d) {
df <- setNames(transform(data.frame(get(d)), letter=names(get(d))), c(d, "letter"))
merge(all_name_df, df, all.x=TRUE)[-1] # -1 REMOVES letter COLUMN
})
master_df <- cbind(all_name_df, do.call(cbind, df_list))
head(master_df, 10)
# letter x1 x2 x3
# 1 A1 NA NA NA
# 2 A2 NA 32 19
# 3 A3 50 12 5
# 4 A4 34 8 1
# 5 A5 3 31 NA
# 6 A6 42 7 NA
# 7 A7 NA NA NA
# 8 A8 NA 40 NA
# 9 A9 27 44 41
# 10 A10 NA NA NA