我的数据如下:
一组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
或任何其他可能扩展到长期怪异数据框架的方式
答案 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)
这种事情也可以用因子来完成