出于演示目的,我有以下数据集:
df <- data.frame(A = as.factor(floor(runif(20,1,6))),
B = as.factor(floor(runif(20,1,6))),
C = as.factor(floor(runif(20,1,6))),
D = c(rep('X',3), rep("Y",7), rep('Z',10)))
如何迭代A,B和C列以获取
的计数count(df, D, A), count(df, D, B) and count(df, D, C)
这是一个简化版本,如果我需要为20个或更多变量执行此操作,我该如何自动执行该过程?
我试过了:
f <- function(x) count(df, D, x)
result <- bind_rows(lapply(df[ , c('A','B','C')], f))
我收到以下错误:
Error in grouped_df_impl(data, unname(vars), drop) :
Column `x` is unknown
答案 0 :(得分:2)
使用tidyr::gather
首先为您工作,以便您可以同时为不同的变量执行count
所有操作吗?正如@alistaire在评论中指出的那样,这可以使用
df %>% gather(key, value, -D) %>% count(D, key, value)
导致与我不必要的额外使用group_by
df %>% gather(key, value, -D) %>% group_by(D, key) %>% count(value)
工作解决方案
library(tidyverse)
df %>% gather(key, value, -D) %>% group_by(D, key) %>% count(value)
#> # A tibble: 34 x 4
#> # Groups: D, key [9]
#> D key value n
#> <fctr> <chr> <chr> <int>
#> 1 X A 2 1
#> 2 X A 3 1
#> 3 X A 4 1
#> 4 X B 4 2
#> 5 X B 5 1
#> 6 X C 1 1
#> 7 X C 3 2
#> 8 Y A 1 1
#> 9 Y A 3 3
#> 10 Y A 5 3
#> # ... with 24 more rows
来源数据
set.seed(123)
df<-data.frame(A=as.factor(floor(runif(20,1,6))),
B=as.factor(floor(runif(20,1,6))),
C=as.factor(floor(runif(20,1,6))),
D=c(rep('X',3),rep("Y",7),rep('Z',10)))
答案 1 :(得分:1)
我们可以使用map2
来处理涉及除&#39; D&#39;之外的列的列的子集count
。用&#39; D&#39;
library(tidyverse)
lst <- map2(names(df)[1:3], names(df)[4], ~count(df[c(.x, .y)],
!!!rlang::syms(c(.x, .y))))
lst
#[[1]]
# A tibble: 11 x 3
# A D n
# <fctr> <fctr> <int>
# 1 1 Z 2
# 2 2 X 1
# 3 2 Y 1
# 4 2 Z 2
# 5 3 X 2
# 6 3 Y 2
# 7 3 Z 4
# 8 4 Y 2
# 9 4 Z 1
#10 5 Y 2
#11 5 Z 1
#[[2]]
# A tibble: 11 x 3
# B D n
# <fctr> <fctr> <int>
# 1 1 Y 2
# 2 1 Z 2
# 3 2 Y 1
# 4 2 Z 1
# 5 3 Y 1
# 6 3 Z 2
# 7 4 X 3
# 8 4 Y 2
# 9 4 Z 3
#10 5 Y 1
#11 5 Z 2
#[[3]]
# A tibble: 12 x 3
# C D n
# <fctr> <fctr> <int>
# 1 1 Y 1
# 2 1 Z 1
# 3 2 X 2
# 4 2 Y 1
# 5 2 Z 4
# 6 3 X 1
# 7 3 Y 2
# 8 3 Z 1
# 9 4 Y 2
#10 4 Z 3
#11 5 Y 1
#12 5 Z 1
目前尚不清楚是否拥有单个数据集或list
数据集