gpt4 book ai didi

r - data.table 的 j 表达式中的列(带/不带 by 语句)

转载 作者:行者123 更新时间:2023-12-02 04:31:07 24 4
gpt4 key购买 nike

这里有两个人为的但我希望能解决我的问题的教学例子。

1)运行此代码时:

> dat0 <- data.frame(A=c("a","a","b"), B="")
> data.table(dat0)[, lapply(.SD, function(x) length(A)) , by = "A"]
A B
1: a 1
2: b 1

我期望输出

   A B
1: a 2
2: b 1

(类似于 plyr::ddply(dat0, .(A), nrow))。

更新问题 1)

让我举一个不太人为的例子。考虑以下数据框:

dat0 <- data.frame(A=c("a","a","b"), x=c(1,2,3), y=c(9,8,7))
> dat0
A x y
1 a 1 9
2 a 2 8
3 b 3 7

使用 plyr 包,我通过 A 的每个值获取 xy 的平均值,如下所示:

> ddply(dat0, .(A), summarise, x=mean(x), y=mean(y))
A x y
1 a 1.5 8.5
2 b 3.0 7.0

非常好。现在想象另一个变量 H 和以下计算:

dat0 <- data.frame(A=c("a","a","b"), H=c(0,1,-1), x=c(1,2,3), y=c(9,8,7))
> ddply(dat0, .(A), summarise, x=mean(x)^mean(H), y=mean(y)^mean(H))
A x y
1 a 1.2247449 2.9154759
2 b 0.3333333 0.1428571

也非常好。 但是现在,想象一下您想要计算大量变量xmean(x)^mean(H)。然后我不想输入:

ddply(dat0, .(A), summarise, a=mean(a)^mean(H), b=mean(b)^mean(H), c=mean(c)^mean(H), d=mean(d)^mean(H), ...........)

所以我的想法是尝试:

flipcols <- my_selected_columns # c("a", "b", "c", "d", ....)
data.table(dat0)[, lapply(.SD, function(x) mean(x)^mean(H)), by = "A", .SDcols = flipcols]

但这不起作用,因为 function(x)mean(x)^mean(H)H 的存在没有按照我的预期进行处理!我也无法使其与 plyr::colwise 一起使用。

2)运行此代码时:

> dat0 <- data.frame(A=c("a","a","b"), B=1:3, c=0)
> data.table(dat0)[, lapply(.SD, function(x) B), .SDcols="c"]
Error in ..FUN(c) : object 'B' not found

我希望它能工作并生成:

   c
1: 1
2: 2
3: 3

那么有没有办法在转换中使用原始 data.table 的列?

最佳答案

1) 使用.N。分组变量 A 的长度为 1,因为每个组只有一个 A 值(这是分组含义的定义):

dt <- data.table(A=c("a","a","b"), B="")
dt[, .N, by = A]
# A N
#1: a 2
#2: b 1

(更新 1) 这与 2) 是同一问题。解决方法是不使用 .SDcols:

dt = data.table(A=c("a","a","b"), H=c(0,1,-1), x=c(1,2,3), y=c(9,8,7))
dt[, lapply(.SD[, !"H"], function(x) mean(x) ^ mean(H)), by = A]
# A x y
#1: a 1.2247449 2.9154759
#2: b 0.3333333 0.1428571

2) 这是之前报告过的错误:https://r-forge.r-project.org/tracker/index.php?func=detail&aid=5222&group_id=240&atid=975

关于r - data.table 的 j 表达式中的列(带/不带 by 语句),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23091233/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com