gpt4 book ai didi

r - 使用 ifelse 和 group by 改变 data.table 中的列

转载 作者:行者123 更新时间:2023-12-04 12:42:35 26 4
gpt4 key购买 nike

我有一些 dplyr 代码正在移动到 data.table,这是我刚遇到的问题。如果 a 大于或等于 3。但是在运行这段代码之后:

df = data.frame(a = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3), 
b = c(0, 1, 0, 1, 0, 1, 1, 0, 3, 4, 5))

setDT(df)
df[ , c := ifelse(a >= 3, c(0, diff(b)), b), by = .(a)]

c中的所有元素都是0,这是为什么?

df 
a b c
1: 1 0 0
2: 1 1 0
3: 1 0 0
4: 1 1 0
5: 2 0 0
6: 2 1 0
7: 2 1 0
8: 3 0 0
9: 3 3 0
10: 3 4 0
11: 3 5 0

我认为是等效的 dplyr:

df = data.frame(a = c(1, 1, 1, 1, 2, 2, 2, 3, 3, 3, 3), 
b = c(0, 1, 0, 1, 0, 1, 1, 0, 3, 4, 5))

df %>%
group_by(a) %>%
mutate(c = ifelse( a >= 3, c(0, diff(b)), b))

最佳答案

根据ifelse(test, yes, no) 的帮助,它应该返回...

A vector of the same length and attributes (including dimensions and "class") as test and data values from the values of yes or no. The mode of the answer will be coerced from logical to accommodate first any values taken from yes and then any values taken from no.

但是:

> df %>% group_by(a) %>% do(print(.$a))
[1] 1 1 1 1
[1] 2 2 2
[1] 3 3 3 3
> data.table(df)[, print(a), by=a]
[1] 1
[1] 2
[1] 3

如帮助页面中所述,由于第一个参数的长度为 1,如果您为其他部分传递向量,则仅使用它们的第一个元素:

> ifelse(TRUE, 1:10, eleventy + million)
[1] 1

在处理常量值时,您可能应该使用 if ... else ...,例如...

> data.table(df)[, b := if (a >= 3) c(0, diff(b)) else b, by=a]

甚至更好,在这种情况下,您可以分配给一个子集:

> data.table(df)[a >= 3, b := c(0, diff(b)), by=a]

关于为什么 a 的 data.table 习惯用法的长度为 1,请参阅其常见问题解答“在每个组中,为什么组变量长度为 1?”

关于r - 使用 ifelse 和 group by 改变 data.table 中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56568900/

26 4 0