如何使用每个向量元素的名称(在R中)将多个向量组合到一个数据帧中
我想将多个向量连接到一个数据帧中,使用每个向量的名称来指导连接 例如,如果我有向量x1、x2和x3:如何使用每个向量元素的名称(在R中)将多个向量组合到一个数据帧中,r,dataframe,vector,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(n
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))
这意味着名称A1仅与x1中的值(即3)关联,而不与x2或x3中的值关联。A2仅与矢量x2和x3中的值关联,而与x1中的值无关。等等
你知道怎么做吗
非常感谢,我提出了这样的建议:
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多个向量这样做,你知道如何把它放到lappy或类似的东西中吗
再次感谢创建数据帧列表后,请考虑以下问题:
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
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
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