在R中添加来自不同数据帧的列

时间:2016-12-11 08:48:24

标签: r dataframe

我是一个R菜鸟!我正在尝试使用一个数据帧作为元数据来创建另一个数据帧中的列。我正在使用apply但是没有创建列。想法?

meta <- data.frame(colname = c("a","b","c"))
frm <- data.frame(z=c(1,2,3))
frm["y"] <- 1
colnames(frm)
apply(meta, 1, function(x) {
  frm[x["colname"]] <- 1
})
colnames(frm)  #hoping for a/b/c columns now

哪个输出:

> meta <- data.frame(colname = c("a","b","c"))
> frm <- data.frame(z=c(1,2,3))
> frm["y"] <- 1
> colnames(frm)
[1] "z" "y"
> apply(meta, 1, function(x) {
+   frm[x["colname"]] <- 1
+ })
[1] 1 1 1
> colnames(frm)  #hoping for a/b/c columns now
[1] "z" "y"

更新:找到答案: how to access global/outer scope variable from R apply function?

需要使用&lt;&lt; -

来访问apply范围之外的变量
meta <- data.frame(colname = c("a","b","c"))
frm <- data.frame(z=c(1,2,3))
frm["y"] <- 1
colnames(frm)
apply(meta, 1, function(x) {
  frm[x["colname"]] <<- 1  #DBL ARROW DID IT
})
colnames(frm)  #hoping for a/b/c columns now

1 个答案:

答案 0 :(得分:1)

'meta'中的colnamefactor类,因此我们需要将其转换为character并使用它在'frm'中创建新列

frm[as.character(meta[[1]])] <- 1
head(frm,2)
#  z y a b c
#1 1 1 1 1 1
#2 2 1 1 1 1

如果我们需要遍历'meta'名称

for(cn in as.character(meta$colname)) frm[[cn]] <- 1