R如何仅在所有元素都为零时才替换组的元素
R How to replace elements of a group only when all elements are zero
我有 data.table dt
,只有当组中的所有元素都为零时,我想向其中添加一个新列 new_col
。
library(data.table)
a <- c(1, 2, 3, 0, 0, 0, 0, 1)
group <- c("a", "a", "a", "b", "b", "c", "c", "c")
dt = data.table(a, group)
dt[]
a group
1: 1 a
2: 2 a
3: 3 a
4: 0 b
5: 0 b
6: 0 c
7: 0 c
8: 1 c
以下是我绑定的代码
dt[, new_col := ifelse(all(a == 0), NA, a), by = group]
dt[]
我得到的输出是
a group new_col
1: 1 a 1
2: 2 a 1
3: 3 a 1
4: 0 b NA
5: 0 b NA
6: 0 c 0
7: 0 c 0
8: 1 c 0
预期输出为
a group new_col
1: 1 a 1
2: 2 a 2
3: 3 a 3
4: 0 b NA
5: 0 b NA
6: 0 c 0
7: 0 c 0
8: 1 c 1
有人可以指出我做错了什么吗?
在这里,我们可以使用 if/else
,因为 ifelse
要求所有参数的长度相同 all(a == 0)
的长度为 1,以及 'yes' 但 'no'的长度不是1,导致回收
dt[, new_col := if(all(a == 0)) NA else a, by = group]
-输出
dt
a group new_col
1: 1 a 1
2: 2 a 2
3: 3 a 3
4: 0 b NA
5: 0 b NA
6: 0 c 0
7: 0 c 0
8: 1 c 1
或者也可以使用.I
获取否定表达式的行索引(或使用any
),提取($V1
)并从[=28=中分配那些元素] 到 new_col。默认情况下,其他元素将为 NA
dt[dt[, .I[!all(a == 0)], group]$V1, new_col := a]
我有 data.table dt
,只有当组中的所有元素都为零时,我想向其中添加一个新列 new_col
。
library(data.table)
a <- c(1, 2, 3, 0, 0, 0, 0, 1)
group <- c("a", "a", "a", "b", "b", "c", "c", "c")
dt = data.table(a, group)
dt[]
a group
1: 1 a
2: 2 a
3: 3 a
4: 0 b
5: 0 b
6: 0 c
7: 0 c
8: 1 c
以下是我绑定的代码
dt[, new_col := ifelse(all(a == 0), NA, a), by = group]
dt[]
我得到的输出是
a group new_col
1: 1 a 1
2: 2 a 1
3: 3 a 1
4: 0 b NA
5: 0 b NA
6: 0 c 0
7: 0 c 0
8: 1 c 0
预期输出为
a group new_col
1: 1 a 1
2: 2 a 2
3: 3 a 3
4: 0 b NA
5: 0 b NA
6: 0 c 0
7: 0 c 0
8: 1 c 1
有人可以指出我做错了什么吗?
在这里,我们可以使用 if/else
,因为 ifelse
要求所有参数的长度相同 all(a == 0)
的长度为 1,以及 'yes' 但 'no'的长度不是1,导致回收
dt[, new_col := if(all(a == 0)) NA else a, by = group]
-输出
dt
a group new_col
1: 1 a 1
2: 2 a 2
3: 3 a 3
4: 0 b NA
5: 0 b NA
6: 0 c 0
7: 0 c 0
8: 1 c 1
或者也可以使用.I
获取否定表达式的行索引(或使用any
),提取($V1
)并从[=28=中分配那些元素] 到 new_col。默认情况下,其他元素将为 NA
dt[dt[, .I[!all(a == 0)], group]$V1, new_col := a]