分组和计数实例?
Grouping and Counting instances?
是否可以使用 R (dplyr) 对所有其他列的实例进行分组和计数?例如,以下数据框
x a b c
1 0 0 0
1 1 0 1
1 2 2 1
2 1 2 1
转向这个(注意:y是正在计算的值)
编辑:- 解释转换,x 是我分组的依据,对于每个分组的数字,我想计算 0 和 1 和 2 被提及的次数,如转换数据帧的第一行, 我们计算了在其他列 (y) 中 x = 1 等于 0 的次数,因此 0 在 a 列中出现一次,在 b 列中出现两次,在 c 列中出现一次
x y a b c
1 0 1 2 1
1 1 1 0 2
1 2 1 1 0
2 1 1 0 1
2 2 0 1 0
我会结合使用 tidyr
包中的 gather
和 spread
,以及 dplyr
:
中的 count
library(dplyr)
library(tidyr)
df = data.frame(x = c(1,1,1,2), a = c(0,1,2,1), b = c(0,0,2,2), c = c(0,1,1,1))
res = df %>%
gather(variable, value, -x) %>%
count(x, variable, value) %>%
spread(variable, n, fill = 0)
# Source: local data frame [5 x 5]
#
# x value a b c
# 1 1 0 1 2 1
# 2 1 1 1 0 2
# 3 1 2 1 1 0
# 4 2 1 1 0 1
# 5 2 2 0 1 0
本质上,您首先将数据集的格式更改为:
head(df %>%
gather(variable, value, -x))
# x variable value
#1 1 a 0
#2 1 a 1
#3 1 a 2
#4 2 a 1
#5 1 b 0
#6 1 b 0
这允许您使用 count
获取有关某些值在列 a
到 c
中出现频率的信息。之后,使用 spread
.
将数据集重新格式化为所需的格式
结合data.table或reshape2[=36的melt
和dcast
函数的方法=]:
library(data.table) # v1.9.5+
dt.new <- dcast(melt(setDT(df), id.vars="x"), x + value ~ variable)
这给出:
dt.new
# x value a b c
# 1: 1 0 1 2 1
# 2: 1 1 1 0 2
# 3: 1 2 1 1 0
# 4: 2 1 1 0 1
# 5: 2 2 0 1 0
在 dcast
中,您可以指定要使用的聚合函数,但在这种情况下没有必要,因为默认聚合函数是 length
。如果不使用聚合函数,您将收到一条警告:
Aggregation function missing: defaulting to length
此外,如果您没有明确地将数据帧转换为数据 table,data.table
将重定向到 reshape2
(请参阅评论中@Arun 的解释)。因此,此方法也可以与 reshape2
一起使用:
library(reshape2)
df.new <- dcast(melt(df, id.vars="x"), x + value ~ variable)
使用数据:
df <- read.table(text="x a b c
1 0 0 0
1 1 0 1
1 2 2 1
2 1 2 1", header=TRUE)
是否可以使用 R (dplyr) 对所有其他列的实例进行分组和计数?例如,以下数据框
x a b c
1 0 0 0
1 1 0 1
1 2 2 1
2 1 2 1
转向这个(注意:y是正在计算的值)
编辑:- 解释转换,x 是我分组的依据,对于每个分组的数字,我想计算 0 和 1 和 2 被提及的次数,如转换数据帧的第一行, 我们计算了在其他列 (y) 中 x = 1 等于 0 的次数,因此 0 在 a 列中出现一次,在 b 列中出现两次,在 c 列中出现一次
x y a b c
1 0 1 2 1
1 1 1 0 2
1 2 1 1 0
2 1 1 0 1
2 2 0 1 0
我会结合使用 tidyr
包中的 gather
和 spread
,以及 dplyr
:
count
library(dplyr)
library(tidyr)
df = data.frame(x = c(1,1,1,2), a = c(0,1,2,1), b = c(0,0,2,2), c = c(0,1,1,1))
res = df %>%
gather(variable, value, -x) %>%
count(x, variable, value) %>%
spread(variable, n, fill = 0)
# Source: local data frame [5 x 5]
#
# x value a b c
# 1 1 0 1 2 1
# 2 1 1 1 0 2
# 3 1 2 1 1 0
# 4 2 1 1 0 1
# 5 2 2 0 1 0
本质上,您首先将数据集的格式更改为:
head(df %>%
gather(variable, value, -x))
# x variable value
#1 1 a 0
#2 1 a 1
#3 1 a 2
#4 2 a 1
#5 1 b 0
#6 1 b 0
这允许您使用 count
获取有关某些值在列 a
到 c
中出现频率的信息。之后,使用 spread
.
结合data.table或reshape2[=36的melt
和dcast
函数的方法=]:
library(data.table) # v1.9.5+
dt.new <- dcast(melt(setDT(df), id.vars="x"), x + value ~ variable)
这给出:
dt.new
# x value a b c
# 1: 1 0 1 2 1
# 2: 1 1 1 0 2
# 3: 1 2 1 1 0
# 4: 2 1 1 0 1
# 5: 2 2 0 1 0
在 dcast
中,您可以指定要使用的聚合函数,但在这种情况下没有必要,因为默认聚合函数是 length
。如果不使用聚合函数,您将收到一条警告:
Aggregation function missing: defaulting to length
此外,如果您没有明确地将数据帧转换为数据 table,data.table
将重定向到 reshape2
(请参阅评论中@Arun 的解释)。因此,此方法也可以与 reshape2
一起使用:
library(reshape2)
df.new <- dcast(melt(df, id.vars="x"), x + value ~ variable)
使用数据:
df <- read.table(text="x a b c
1 0 0 0
1 1 0 1
1 2 2 1
2 1 2 1", header=TRUE)