我有一个数据框
x <-
id1 id2 id3 id4
1 a 12x 1001
2 a 23x 2001
3 a 98y 3001
2 a 98y 1001
2 b 12x 2001
1 b 23x 3001
2 b 12x 1001
3 b 98y 2001
我正在尝试编写一个函数,它将所有列名作为参数,按每个列的count聚合,并返回不同的数据帧(在这种情况下为4),其中汇总了一列。
答案 0 :(得分:1)
我使用:
重新创建了对象x
text = "id1 id2 id3 id4
1 a 12x 1001
2 a 23x 2001
3 a 98y 3001
2 a 98y 1001
2 b 12x 2001
1 b 23x 3001
2 b 12x 1001
3 b 98y 2001"
x <- read.table(text = text, header = TRUE)
然后,您可以使用lapply()
浏览ID列表并应用匿名函数,该函数采用id
和数据框,按id
中指定的字符对其进行分组,每个df
组总结(即计算观察次数)id
。
library(dplyr)
lapply(list("id1", "id2", "id3", "id4"), function(id, df) {
df %>%
group_by_at(.vars = id) %>%
summarise(n = n())
}, df = x)
它返回4个tibble
的列表(data.frame
s的扩展名):
[[1]]
# A tibble: 3 x 2
id1 n
<int> <int>
1 1 2
2 2 4
3 3 2
[[2]]
# A tibble: 2 x 2
id2 n
<fct> <int>
1 a 4
2 b 4
[[3]]
# A tibble: 3 x 2
id3 n
<fct> <int>
1 12x 3
2 23x 2
3 98y 3
[[4]]
# A tibble: 3 x 2
id4 n
<int> <int>
1 1001 3
2 2001 3
3 3001 2
答案 1 :(得分:1)
我们可以将map
与dplyr
count
library(tidyverse)
names(df) %>%
map(~ df %>%
count(!! rlang::sym(.x))
)
-output
#[[1]]
# A tibble: 3 x 2
# id1 n
# <int> <int>
#1 1 2
#2 2 4
#3 3 2
#[[2]]
# A tibble: 2 x 2
# id2 n
# <chr> <int>
#1 a 4
#2 b 4
#[[3]]
# A tibble: 3 x 2
# id3 n
# <chr> <int>
#1 12x 3
#2 23x 2
#3 98y 3
#[[4]]
# A tibble: 3 x 2
# id4 n
# <int> <int>
#1 1001 3
#2 2001 3
#3 3001 2
答案 2 :(得分:1)
以下是使用tidyr
的{{1}} / dplyr
解决方案:
count
说明:将library(tidyverse);
lst <- x %>%
gather(k, v) %>%
group_by(k, v) %>%
count() %>%
split(.$k)
#$id1
## A tibble: 3 x 3
## Groups: k, v [3]
# k v n
# <chr> <chr> <int>
#1 id1 1 2
#2 id1 2 4
#3 id1 3 2
#
#$id2
## A tibble: 2 x 3
## Groups: k, v [2]
# k v n
# <chr> <chr> <int>
#1 id2 a 4
#2 id2 b 4
#
#$id3
## A tibble: 3 x 3
## Groups: k, v [3]
# k v n
# <chr> <chr> <int>
#1 id3 12x 3
#2 id3 23x 2
#3 id3 98y 3
#
#$id4
## A tibble: 3 x 3
## Groups: k, v [3]
# k v n
# <chr> <chr> <int>
#1 id4 1001 3
#2 id4 2001 3
#3 id4 3001 2
从宽格式转换为长格式,data.frame
按键(列名称)和值(条目),并将条目拆分为count
list
按键(列名)。