2015-11-19 35 views
1

我喜欢数据表并使用它来有条件地重命名或添加因子。但是,我似乎无法一次完成多个因素。这里有一个例子:与数据表同时重命名多个因素

a <- rep(c("A", "B", "C", "D"), each=3) 
b <- 1:12 
df <- data.frame(a,b) 
DT <- data.table(df) 

现在加入新列“新”,这对所有“A” S在列“一”等于“Z”

DT[a=="A", New:="z"] 

这工作得很好。现在,如果我想改变说“A”和“C”等于“Z”:

DT[a==c("A", "C"), New:="z"] 

让我好笑的答案:

dput(DT) 
structure(list(a = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), 
    b = 1:12, New = c("z", NA, "z", NA, NA, NA, NA, "z", NA, 
    NA, NA, NA)), .Names = c("a", "b", "New"), row.names = c(NA, 
-12L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000000140788>, index = structure(integer(0), a = integer(0))) 

我敢肯定,这是简单的东西,我似乎无法在SO上找到它(排队!)。由于

为了确认,我所期望的输出是:

dput(DT) 
structure(list(a = structure(c(1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 
3L, 4L, 4L, 4L), .Label = c("A", "B", "C", "D"), class = "factor"), 
    b = 1:12, New = c("z", "z", "z", NA, NA, NA, "z", "z", "z", 
    NA, NA, NA)), .Names = c("a", "b", "New"), row.names = c(NA, 
-12L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000000140788>, index = structure(integer(0), a = integer(0))) 

回答

5

您应该使用%in%代替==,因此你将需要:

DT[a %in% c("A", "C"), New:="z"] 

这给:

> DT 
    a b New 
1: A 1 z 
2: A 2 z 
3: A 3 z 
4: B 4 NA 
5: B 5 NA 
6: B 6 NA 
7: C 7 z 
8: C 8 z 
9: C 9 z 
10: D 10 NA 
11: D 11 NA 
12: D 12 NA 

点使用的数据:

a <- rep(c("A", "B", "C", "D"), each=3) 
b <- 1:12 
DT <- data.table(a,b) 

在数据框,你可以这样做:

df <- data.frame(a,b) 
df$New <- NA 
df[df$a %in% c("A", "C"), "New"] <- "z" 

来达到同样的效果。