是否可以使用R(dplyr)对所有其他列的实例进行分组和计数?例如,以下数据帧
x a b c
1 0 0 0
1 1 0 1
1 2 2 1
2 1 2 1
Run Code Online (Sandbox Code Playgroud)
转向此(注意: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
Run Code Online (Sandbox Code Playgroud)
用的组合的方法melt和dcast功能data.table或reshape2:
library(data.table) # v1.9.5+
dt.new <- dcast(melt(setDT(df), id.vars="x"), x + value ~ variable)
Run Code Online (Sandbox Code Playgroud)
这给了:
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
Run Code Online (Sandbox Code Playgroud)
在dcast您可以指定要使用的聚合功能,但是这是在这种情况下,默认聚合函数是没有必要的length.如果不使用聚合函数,您将收到有关该函数的警告:
聚合函数缺失:默认为长度
此外,如果您没有将数据帧显式转换为数据表,data.table则会重定向到reshape2(请参阅注释中@Arun的说明).因此,此方法也可以使用reshape2:
library(reshape2)
df.new <- dcast(melt(df, id.vars="x"), x + value ~ variable)
Run Code Online (Sandbox Code Playgroud)
使用数据:
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)
Run Code Online (Sandbox Code Playgroud)