我已将文件中的数据导入到R中的数据框中。就像这样。
Name Count Category
A 100 Cat1
C 10 Cat2
D 40 Cat1
E 30 Cat3
H 3 Cat3
Z 20 Cat2
M 50 Cat10
所以现在我想添加类别列,具体取决于名称列中的值。所以如果Name =(A,D),Category ='Cat1'等等。
这只是我给出的一个简单例子。我有大量的名称和类别,所以我想要一个紧凑的语法。我怎么能这样做?
编辑:我已经更改了示例以更好地满足我的需求,因为名称可以是任何数字。很抱歉以前不太清楚。
答案 0 :(得分:3)
您可以使用ifelse
。如果您的数据框名为df
,则可以执行以下操作:
df$cat <- ifelse(df$name<100, "Ones", "Hundreds")
df$cat <- ifelse(df$name<1000, df$cat, "Thousands")
答案 1 :(得分:2)
您可以使用地图。 (更新使用stringsAsFactors = FALSE
)
df <- data.frame( Name = c('A', 'C', 'D', 'E', 'H', 'Z', 'M'),
Count = c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)
Categories <- list(Cat1 = c('A','D'),
Cat2 = c('C','Z'),
Cat3 = c('E','H'),
Cat10 = 'M')
nams <- names( Categories )
nums <- sapply(Categories, length)
CatMap <- unlist( Map( rep, nams, nums ) )
names(CatMap) <- unlist( Categories )
df <- transform( df, Category = CatMap[ Name ])
答案 2 :(得分:2)
[根据OP的评论更新并更改了Q]
DF <- data.frame(Name = c("A","C","D","E","H","Z","M"),
Count = c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)
lookup <- data.frame(Name = c("A","C","D","E","H","Z","M"),
Category = paste("Cat", c(1,2,1,3,3,2,10), sep = ""),
stringsAsFactors = FALSE)
使用上述数据框,我们可以进行数据库合并。您需要为所需的lookup
Name
组合设置Category
,如果没有非常大量的Name
s,那就没问题了(至少你只需要在lookup
中列出一次,而不必按顺序列出 - 首先列出所有Cat1
Name
,等等):
> merge(DF, lookup, by = "Name")
Name Count Category
1 A 100 Cat1
2 C 10 Cat2
3 D 40 Cat1
4 E 30 Cat3
5 H 3 Cat3
6 M 50 Cat10
7 Z 20 Cat2
> merge(DF, lookup, by = "Name", sort = FALSE)
Name Count Category
1 A 100 Cat1
2 C 10 Cat2
3 D 40 Cat1
4 E 30 Cat3
5 H 3 Cat3
6 Z 20 Cat2
7 M 50 Cat10
一种选择是索引:
foo <- function(x) {
out <- character(length = length(x))
chars <- c("Ones", "Tens", "Hundreds", "Thousands")
out[x < 10] <- chars[1]
out[x >= 10 & x < 100] <- chars[2]
out[x >= 100 & x < 1000] <- chars[3]
out[x >= 1000 & x < 10000] <- chars[4]
return(factor(out, levels = chars))
}
更好地扩展的替代方案是,
bar <- function(x, cats = c("Ones", "Tens", "Hundreds", "Thousands")) {
out <- cats[floor(log10(x)) + 1]
factor(out, levels = cats)
}
答案 3 :(得分:0)
退房:
cut()
recode()
在car
包中
答案 4 :(得分:0)
使用ifelse和%in%:
可能更简单,更易读df <- data.frame( Name = c('A', 'C', 'D', 'E', 'H', 'Z', 'M'),
Count =c(100,10,40,30,3,20,50), stringsAsFactors = FALSE)
cat1 = c("A","D")
cat2 = c("C","Z")
cat3 = c("E","H")
cat10 = c("M")
df$Category = ifelse(df$Name %in% cat1, "Cat1",
ifelse(df$Name %in% cat2, "Cat2",
ifelse(df$Name %in% cat3, "Cat3",
ifelse(df$Name %in% cat10, "Cat10",
NA))))
Name Count Category
1 A 100 Cat1
2 C 10 Cat2
3 D 40 Cat1
4 E 30 Cat3
5 H 3 Cat3
6 Z 20 Cat2
7 M 50 Cat10