【问题标题】:Create a new column based on values from other variables根据其他变量的值创建一个新列
【发布时间】:2015-09-24 07:36:23
【问题描述】:

我的数据如下所示:

一组 10 个字符变量

Char<-c("A","B","C","D","E","F","G","H","I","J")

还有一个像这样的数据框

Col1<-seq(1:25)
Col2<-c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3,4,4,4,4,4,5,5,5,5,5)
DF<-data.frame(Col1,Col2)

我想做的是在数据框中添加第三列,其逻辑是 1=A、2=B、3=C 等等。所以最终的结果是

Col3<-c("A","A","A","A","A","B","B","B","B","B","C","C","C","C","C","D","D","D","D","D","E","E","E","E","E")
DF<-data.frame(Col1,Col2,Col3)

对于这个简单的示例,我可以使用如下问题的简单替换: Create new column based on 4 values in another column

但我的实际数据集比这个简单的例子要大得多,变量多得多,所以不可能像上面的答案那样写出等价物。

所以我想要一些可以应用于更大数据帧的代码。也许是循环遍历 Col2 的所有值并将它们与 Char 的位置相匹配的东西。

1=Char[1]  2=Char[2] 3=Char[3]...... for the entire length of Col2

或任何其他可以扩展到长的可怕数据框的方式

【问题讨论】:

  • Char[Col2] 在您的示例中给出了输出。这就是你所需要的吗?
  • 我喜欢这种简单。它适用于这个例子,但在我的数据集中 Col2 不是一个简单的数字序列。但是,如果我可以将我的实际数据转化为上面的一系列数字(也许使用唯一的?),那么这种方法将是完美的。
  • 如果您的查找代码不同,您可以命名Char 向量,它将充当查找表。 names(Char) &lt;- codes。然后你可以使用Char[Col2],它会根据名称而不是索引进行子集化。

标签: r dataframe


【解决方案1】:
# Values that Col2 might have taken
levels = c(1, 2, 3, 4, 5)

# Labels for the levels in same order as levels
labels = c('A', 'B', 'C', 'D', 'E')

DF$Col3 <- factor(DF$Col2, levels = levels, labels = labels)

【讨论】:

    【解决方案2】:

    我知道在 R 中使用 for 循环可能是禁忌,但我试过了,效果很好。

    for (i in length(DF$Col2)) {
        DF$Col3[i] <- Char[DF$Col2[i]]
    }
    

    这就足够了吗?我想你也可以unique(DF$Col2)levels(factor(DF$Col2))

    也许我误解了你的问题。

    【讨论】:

    • 我喜欢 for 循环,因为我自己发现它们更直观
    【解决方案3】:

    如果您想将每一列用作某个向量的索引(我将使用letters,因此我最多可以索引 25 个),返回与DF 相同维度的数据框,您可以使用:

    transformed <- as.data.frame(lapply(DF, function(x) letters[x]))
    head(transformed)
    #   Col1 Col2
    # 1    a    a
    # 2    b    a
    # 3    c    a
    # 4    d    a
    # 5    e    a
    # 6    f    b
    

    然后您可以将其与您的原始数据框与cbind(DF, transformed) 结合起来。

    【讨论】:

      【解决方案4】:

      为什么不制作密钥并加入?

      library(dplyr)
      
      letter_key = data_frame(letter__ID = 1:26,
                              letter = letters)
      
      DF %>%
        rename(letter__ID = Col2) %>%
        left_join(letter_key)
      

      这种事情也可以用因素来做

      【讨论】:

        最近更新 更多