我有一个数据框,例如:
city <- c("a","a","b","b","c","c","c","c","d","e","e","f")
x <- c(0,0,0,1,1,1,0,0,0,1,1,1)
y <- c(1,1,0,0,0,1,1,0,0,1,0,1)
z <- c(1,0,0,0,0,0,0,0,0,0,1,0)
k <- c(1,1,0,0,0,1,0,0,1,0,0,0)
df <- data.frame(city, x, y, z, k)
,其中有一个分组变量(例如城市)和几个虚拟变量。我想计算每个虚拟变量= 1的城市数。
到目前为止,我管理的工作是计算有多少城市有特定的虚拟对象= 1:
> n_groups(filter(df, x == 1) %>%
+ group_by(city))
[1] 4
但是,我想知道是否有可能对我的数据框中的所有虚拟对象执行此操作,以便获得类似的信息:
var count
x 4
y 4
z 2
k 3
我拥有每个虚拟变量等于1(计数列)的城市数量,而不必对样本中的所有虚拟变量进行单独计算。
感谢您的帮助!
答案 0 :(得分:5)
R基:
colSums(rowsum(df[, -1], df[, 1]) > 0)
#x y z k
#4 4 2 3
答案 1 :(得分:2)
使用dplyr
和tidyr
:
library(dplyr)
library(tidyr)
df %>%
gather(k, v, -1) %>%
filter(v == 1) %>%
group_by(k) %>%
summarise(cnt = n_distinct(city))
结果:
# A tibble: 4 x 2
k cnt
<chr> <int>
1 k 3
2 x 4
3 y 4
4 z 2
答案 2 :(得分:1)
使用data.table
:
library(data.table)
setDT(df)
df[, lapply(.SD, max), city][, colSums(.SD), .SDcols = -1]
x y z k
4 4 2 3