如何使用每个向量的元素名称将多个向量组合到数据框中(在R中)

时间:2018-06-17 17:15:32

标签: r dataframe vector

我想将多个向量连接到一个数据框中,使用每个向量的名称来指导连接。

例如,如果我有向量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中的值相关联。等

知道如何做到这一点吗?

非常感谢,

2 个答案:

答案 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