根据其他变量的值创建新列

时间:2015-09-23 21:31:14

标签: r dataframe

我的数据如下:

一组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

或任何其他可能扩展到长期怪异数据框架的方式

4 个答案:

答案 0 :(得分:5)

# 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)

答案 1 :(得分:3)

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

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 合并。

答案 2 :(得分:3)

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

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

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

也许我误解了你的问题。

答案 3 :(得分:3)

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

library(dplyr)

letter_key = data_frame(letter__ID = 1:26,
                        letter = letters)

DF %>%
  rename(letter__ID = Col2) %>%
  left_join(letter_key)

这种事情也可以用因子来完成