R 使用表分组:无效';类型';(性质)论据

R 使用表分组:无效';类型';(性质)论据,r,grouping,R,Grouping,我最近问了一个问题,关于如何在布尔表达式为1或0的新数据帧中获取列的内容并将其用作列标题。如果它包含R中的值 例如 Id. Event A. Wc B. Df C. Df A. Df 需要转换为 Wc df A 1. 1 B 0. 1 C. 0. 1 我一直在玩它,它似乎工作良好,但最近我得到了以下错误 FUN(X[[1L]],…)中的错误:参数的“类型”(字符)无效 下面是回溯() lappy(X=split(e,grp)

我最近问了一个问题,关于如何在布尔表达式为1或0的新数据帧中获取列的内容并将其用作列标题。如果它包含R中的值

例如

Id.   Event
A.    Wc
B.    Df
C.    Df
A.    Df
需要转换为

     Wc df
A   1.    1
B   0.     1
C.  0.    1
我一直在玩它,它似乎工作良好,但最近我得到了以下错误

FUN(X[[1L]],…)中的错误:参数的“类型”(字符)无效

下面是回溯()

lappy(X=split(e,grp),FUN=FUN,…)
4:乐趣(X[[1L]],…)
3:lappy(x,函数(e){

ans对于每个
Id
,通过一个简单的
实现,您可以很容易地获得所需的输出。下面是一个可能的
数据。表
(您已经在使用)实现

library(data.table)
setDT(df)[, as.list(table(Event)), by = Id]
#    Id Df Wc
# 1:  A  1  1
# 2:  B  1  0
# 3:  C  1  0
或者,(根据建议)您可以使用简单的
dcast

dcast(setDT(df), Id ~ Event, fun = length, value.var = "Event")
#    Id Df Wc
# 1:  A  1  1
# 2:  B  1  0
# 3:  C  1  0
或者类似地

library(reshape2)
dcast(df, Id ~ Event, fun = length, value.var = "Event")
或者使用
tidyr
见下面的注释)


  • 注意
    扩展
    重塑
    在相同的
    Id
    具有相同的
    事件
    不止一次的情况下不起作用,因为它们没有
    乐趣。聚合
    参数,因此它们不知道如何处理它

基准

library(microbenchmark)
set.seed(123)
n <- 1e7
df <- data.frame(Id = sample(LETTERS, n, replace  = TRUE),
                 Event = sample(outer(LETTERS, letters, paste0), n, replace = TRUE))
dt <- copy(df)

DT1 <- function(x) setDT(x)[, as.list(table(Event)), by = Id]
DT2 <- function(x) dcast.data.table(setDT(x), Id ~ Event, fun = length, value.var = "Event")
RESHAPE2 <- function(x) dcast(x, Id ~ Event, fun = length, value.var = "Event")

microbenchmark(DT1(dt), DT2(dt), RESHAPE2(df))
# Unit: milliseconds
#         expr       min        lq      mean    median        uq       max neval
#      DT1(dt)  965.5181  987.8140 1017.8237 1007.1197 1030.7272 1285.9206   100
#      DT2(dt)  406.7124  420.6203  446.8026  434.2489  455.4364  592.4333   100
# RESHAPE2(df) 2969.0057 3035.5817 3190.6514 3099.3221 3240.4642 4384.6316   100
库(微基准)
种子集(123)

n对于每个
Id
,通过一个简单的
实现,您可以很容易地获得所需的输出。下面是一个可能的
数据。表
(您已经在使用)实现

library(data.table)
setDT(df)[, as.list(table(Event)), by = Id]
#    Id Df Wc
# 1:  A  1  1
# 2:  B  1  0
# 3:  C  1  0
或者,(根据建议)您可以使用简单的
dcast

dcast(setDT(df), Id ~ Event, fun = length, value.var = "Event")
#    Id Df Wc
# 1:  A  1  1
# 2:  B  1  0
# 3:  C  1  0
或者类似地

library(reshape2)
dcast(df, Id ~ Event, fun = length, value.var = "Event")
或者使用
tidyr
见下面的注释)


  • 注意
    扩展
    重塑
    在相同的
    Id
    具有相同的
    事件
    不止一次的情况下不起作用,因为它们没有
    乐趣。聚合
    参数,因此它们不知道如何处理它

基准

library(microbenchmark)
set.seed(123)
n <- 1e7
df <- data.frame(Id = sample(LETTERS, n, replace  = TRUE),
                 Event = sample(outer(LETTERS, letters, paste0), n, replace = TRUE))
dt <- copy(df)

DT1 <- function(x) setDT(x)[, as.list(table(Event)), by = Id]
DT2 <- function(x) dcast.data.table(setDT(x), Id ~ Event, fun = length, value.var = "Event")
RESHAPE2 <- function(x) dcast(x, Id ~ Event, fun = length, value.var = "Event")

microbenchmark(DT1(dt), DT2(dt), RESHAPE2(df))
# Unit: milliseconds
#         expr       min        lq      mean    median        uq       max neval
#      DT1(dt)  965.5181  987.8140 1017.8237 1007.1197 1030.7272 1285.9206   100
#      DT2(dt)  406.7124  420.6203  446.8026  434.2489  455.4364  592.4333   100
# RESHAPE2(df) 2969.0057 3035.5817 3190.6514 3099.3221 3240.4642 4384.6316   100
库(微基准)
种子集(123)

n
traceback()
所说的是什么?请使用链接问题中的数据向我们展示该代码的预期输出,而不是该代码。您好,大卫,我已更新了该问题,以显示最终结果
say请使用链接问题中的数据向我们展示该代码的预期输出,而不是该代码。您好,david,我已更新了问题以显示最终结果。非常感谢david的回答和您的原创。非常感谢david的回答和您的原创
library(microbenchmark)
set.seed(123)
n <- 1e7
df <- data.frame(Id = sample(LETTERS, n, replace  = TRUE),
                 Event = sample(outer(LETTERS, letters, paste0), n, replace = TRUE))
dt <- copy(df)

DT1 <- function(x) setDT(x)[, as.list(table(Event)), by = Id]
DT2 <- function(x) dcast.data.table(setDT(x), Id ~ Event, fun = length, value.var = "Event")
RESHAPE2 <- function(x) dcast(x, Id ~ Event, fun = length, value.var = "Event")

microbenchmark(DT1(dt), DT2(dt), RESHAPE2(df))
# Unit: milliseconds
#         expr       min        lq      mean    median        uq       max neval
#      DT1(dt)  965.5181  987.8140 1017.8237 1007.1197 1030.7272 1285.9206   100
#      DT2(dt)  406.7124  420.6203  446.8026  434.2489  455.4364  592.4333   100
# RESHAPE2(df) 2969.0057 3035.5817 3190.6514 3099.3221 3240.4642 4384.6316   100