R 使用表分组:无效';类型';(性质)论据
我最近问了一个问题,关于如何在布尔表达式为1或0的新数据帧中获取列的内容并将其用作列标题。如果它包含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)
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)
ntraceback()
所说的是什么?请使用链接问题中的数据向我们展示该代码的预期输出,而不是该代码。您好,大卫,我已更新了该问题,以显示最终结果
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