计算值出现在R中任意两列中的行数

au9on6nz  于 2023-04-27  发布在  其他
关注(0)|答案(5)|浏览(100)

我有一个这样的数据集:

data <- read.csv(text = "foo,bar
a,b
a,a
b,c
c,a
c,b")

我想计算一个表,它告诉我每个可能的值出现在多少行中,所以类似于这样:
| 价值|数数|
| --------------|--------------|
| 一种|三|
| B|三|
| c|三|
我试过使用dplyr按两列分组,然后汇总,但这并没有给予你每个值的计数,而是给你每个列的值。

yhived7q

yhived7q1#

使用dplyrtibbletidyr,您可以:

data %>%
 mutate(across(everything(), trimws)) %>%
 rowid_to_column() %>%
 pivot_longer(-rowid) %>%
 group_by(value) %>%
 summarise(n = n_distinct(rowid))

  value     n
  <chr> <int>
1 a         3
2 b         3
3 c         3
brqmpdu1

brqmpdu12#

read.csv(text="foo,bar
 a,b
 a,a
 b,c
 c,a
 c,b", strip.white = TRUE) |>
  mutate(id = row_number()) |>
  pivot_longer(cols = -id) |>
  distinct(id, value) |>
  count(value)
# # A tibble: 3 × 2
#   value     n
#   <chr> <int>
# 1 a         3
# 2 b         3
# 3 c         3
vcudknz3

vcudknz33#

获取每行uniqueunlist结果,并使用table获取计数。

table(unlist(apply(data, 1, unique)))
#a b c 
#3 3 3

或者是用管子。

apply(data, 1, unique) |> unlist() |> table()
#a b c 
#3 3 3
iaqfqrcu

iaqfqrcu4#

另一个选择:

library(dplyr)
library(tidyr)

data %>% 
  mutate(bar1 = ifelse(foo==bar, NA_character_, bar)) %>% 
  pivot_longer(-bar, values_drop_na = TRUE) %>% 
  count(value)

  value     n
  <chr> <int>
1 a         3
2 b         3
3 c         3
gcuhipw9

gcuhipw95#

您可以使用table + rowSums

> rowSums(table(unlist(data), c(row(data))) > 0)
a b c
3 3 3

数据

> dput(data)
structure(list(foo = c("a", "a", "b", "c", "c"), bar = c("b", 
"a", "c", "a", "b")), class = "data.frame", row.names = c(NA,
-5L))

相关问题