【问题标题】:Add columns with predefined values to a dataframe将具有预定义值的列添加到数据框
【发布时间】:2015-06-03 12:39:10
【问题描述】:

我想向数据框中添加新列,其中填充了存储在另一个数据框中的预定义值。最好的方法是什么?

很高兴:如果新变量出现在 d2 中,是否可以使代码动态化?

可重现代码的数据

d1 <- head(iris)                      # dataframe 1 ----------

var <- c("var1", "var2", "var3")
val <- c(5, 7, 1)
d2 <- as.data.frame(cbind(var, val))  # dataframe 2 ----------

预期输出

第一个数据帧

第二个数据帧

期望的输出

最好的问候

【问题讨论】:

  • d1$var1 &lt;- d2[1, 2]; d1$var2 &lt;- d2[2, 2]; d1$var3 &lt;- d2[3, 2] 怎么样? :)
  • 仅供参考,as.data.frame(cbind(x,y)) 不太好,因为cbind 构造了一个矩阵,强制xy 具有相同的类(此处为字符/字符串)。最好做data.frame(x,y)

标签: r dplyr


【解决方案1】:

一种方法是(这适用于任意数量的vars)

d1[as.character(d2$var)] <- rep(d2$val, each = nrow(d1))
#   Sepal.Length Sepal.Width Petal.Length Petal.Width Species var1 var2 var3
# 1          5.1         3.5          1.4         0.2  setosa    5    7    1
# 2          4.9         3.0          1.4         0.2  setosa    5    7    1
# 3          4.7         3.2          1.3         0.2  setosa    5    7    1
# 4          4.6         3.1          1.5         0.2  setosa    5    7    1
# 5          5.0         3.6          1.4         0.2  setosa    5    7    1
# 6          5.4         3.9          1.7         0.4  setosa    5    7    1

【讨论】:

  • 哈。发生在我什至可以修改我的帖子之前。
  • 谢谢你们!这就是我所需要的(我使用 dplyr 的 mutate 函数失败了。)
【解决方案2】:

使用data.table

require(data.table)
setDT(d1)[, as.character(d2$var) := as.list(d2$val)]

as.character() 是必需的,因为您创建d2 的方式导致var 成为factor

【讨论】:

    【解决方案3】:

    这行得通:

    d1 <- head(iris)                      # dataframe 1 ----------
    
    var <- c("var1", "var2", "var3")
    val <- c(5, 7, 1)
    d2 <- as.data.frame(cbind(var, val)) 
    
    for (i in 1:nrow(d2)){
      d1[[as.character(d2$var[i])]] <- rep(d2$val[i],nrow(d1))
    }
    

    我想有一些方法可以在没有 for 循环的情况下做到这一点。我希望大炮很快就会到达并将其减少到一行:)。

    【讨论】:

      【解决方案4】:

      这里有一些转置d2的方法:

      d3 <- d2["val"]; rownames(d3) <- d2[,"var"]
      cbind(d1,t(d3))
      
      d4 <- do.call(data.frame,setNames(as.list(d2$val),d2$var))
      cbind(d1,d4)
      
      dlist5 <- setNames(as.list(d2$val),d2$var)
      do.call(data.frame,c(d1,dlist5))
      

      在所有这些情况下,val 仍然是一个字符串,这不是很好。从valvar开始...

      cbind(d1,t(data.frame(val,row.names=var)))
      

      【讨论】:

        【解决方案5】:

        您也可以使用 tidyr 包。 不过,它对我来说效果很好。

        library("tidyr")
        
        # transform to new columns
        df <- spread(d2, var, val, convert = T)
        df[1,] <- df[!is.na(df)]
        df <- df[1, ]
        
        # combine columns
        result <- d1 %>% cbind(df)
        

        【讨论】:

          猜你喜欢
          • 2015-06-13
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-03-03
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多