我喜欢数据表并使用它来有条件地重命名或添加因子.但是,我似乎不能一次做多个因素.这是一个例子:
a <- rep(c("A", "B", "C", "D"), each=3)
b <- 1:12
df <- data.frame(a,b)
DT <- data.table(df)
Run Code Online (Sandbox Code Playgroud)
现在添加新列"New",对于列"a"中的所有"A"等于"z"
DT[a=="A", New:="z"]
Run Code Online (Sandbox Code Playgroud)
这很好用.现在,如果我想改变说"A"和"C"等于"z":
DT[a==c("A", "C"), New:="z"]
Run Code Online (Sandbox Code Playgroud)
给我有趣的答案:
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)))
Run Code Online (Sandbox Code Playgroud)
我确信它很简单,我似乎无法在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)))
Run Code Online (Sandbox Code Playgroud)
您应该使用%in%而不是==,因此您将需要:
DT[a %in% c("A", "C"), New:="z"]
Run Code Online (Sandbox Code Playgroud)
这使:
> 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
Run Code Online (Sandbox Code Playgroud)
使用数据:
a <- rep(c("A", "B", "C", "D"), each=3)
b <- 1:12
DT <- data.table(a,b)
Run Code Online (Sandbox Code Playgroud)
在数据框中,您可以执行以下操作:
df <- data.frame(a,b)
df$New <- NA
df[df$a %in% c("A", "C"), "New"] <- "z"
Run Code Online (Sandbox Code Playgroud)
达到同样的效果.