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

4
我有这样的数据:
一组由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)

对于这个简单的示例,我可以采用类似于以下问题的简单替换: 基于另一列中的4个值创建新列

但是,我的实际数据集比这个简单的示例要大得多,具有比这更多的变量,因此像上面的答案中写出等价物并不可行。
因此,我想要一些代码,可以应用于一个更大的数据框。也许是通过循环遍历Col2的所有值,并将它们与Char的位置匹配。
1=Char[1]  2=Char[2] 3=Char[3]...... for the entire length of Col2

或者任何其他能够扩展到长而庞大的数据框的方法


3
你的例子中,Char[Col2] 给出了输出结果。这就是你需要的全部吗? - Pierre L
2
我喜欢这种简单的方法。它在这个例子中运行良好,但在我的数据集中,Col2不是一个简单的数字系列。但如果我能够将我的实际数据转化为像上面那样的数字系列(也许使用unique?),那么这种方法就会非常完美。 - Vinterwoo
2
如果您的查找代码不同,您可以给Char向量命名,它将充当查找表。names(Char) <- codes。然后您可以使用Char[Col2],它将根据名称而非索引进行子集选择。 - Pierre L
4个回答

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)

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)将此操作与原始数据框组合。

3

我知道在R语言中使用for循环可能被视为禁忌,但我尝试了一下,效果不错。

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

这样是否足够?我认为你也可以使用unique(DF$Col2)levels(factor(DF$Col2))

也许我误解了你的问题。


1
我喜欢使用for循环,因为我觉得它们更直观一些。 - Vinterwoo

3
为什么不创建一个关键字并将其连接起来?
library(dplyr)

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

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

这种事情也可以通过因子实现。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接