【问题标题】:In R Add Columns From a Different Dataframe在 R 添加来自不同数据框的列
【发布时间】:2017-04-26 08:21:34
【问题描述】:

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

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?

需要使用访问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

【问题讨论】:

    标签: r dataframe


    【解决方案1】:

    'meta' 中的colname 是factor 类,因此我们需要将其转换为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
    

    如果我们需要遍历“元”名称

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

    【讨论】:

    • 谢谢@akrun。我试过了,但我仍然没有得到 a/b/c 列。如果你运行它,你会看到 a/b/c 列吗?
    • @sisdog 这很奇怪。我确实得到了 a、b、c 列。更新了帖子
    • 我认为是 apply() 中的作用域。再次感谢您的帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-21
    • 2021-11-02
    • 1970-01-01
    • 2021-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多