如何检查可以找到多少列字符

How to check in how many columns character can be found

我有一个包含 4 列名称的数据集,其中名称的数量和名称顺序因列而异。某些列还可以包含两次或更多次相同的名称。看起来像这样:

df<- data.frame(x1=c("Ben","Alex","Tim", "Lisa", "MJ","NA", "NA","NA","NA"), 
x2=c("Ben","Paul","Tim", "Linda", "Alex", "MJ", "Lisa", "Ken","NA"), 
x3=c("Tomas","Alex","Ben", "Paul", "MJ", "Tim", "Ben", "Alex", "Linda"), 
x4=c("Ben","Alex","Tim", "Lisa", "MJ", "Ben", "Barbara","NA", "NA"))

现在我必须首先提取数据集中的唯一名称。我使用以下代码做到了这一点:

u<- as.vector(unique(unlist(df)))

其次,我需要找到可以在所有 4 列(class A 名称)、4 列中的 3 列(class B 名称)和 2 列中找到的名称4 列(class C 名称)。

这是我卡住的地方。我只能使用以下方法提取所有 4 列中包含的名称:

n<- ifelse(u%in%df$x1 & u%in%df$x2 & u%in%df$x3 & 
               u%in%df$x4", A, B)

因此,例如,Ben 是 A class 名字,因为它可以在所有 4 列中找到,而 Lisa 将是 B class 名字,因为它只能在 3 列中找到4 列。

Name Class
Ben    A
Lisa   B

有没有更好的方法class根据可以在其中找到的列数来确定唯一名称,以及如何为 B 和 C class 名称完成此操作?

提前致谢!

这是一个基于 base R 的想法。我们遍历唯一元素并在数据帧与每个名称相等时获取 rowSums。最大结果就是你的预期输出

sapply(unique(c(t(df))), function(i) max(rowSums(df == i)))

#  Ben Tomas  Alex  Paul   Tim  Lisa Linda    MJ 
#    3     1     3     1     3     2     1     3 

您可以获得长格式的数据,并针对每个名称找出它出现了多少个唯一列:

library(dplyr)

df %>%
  tidyr::pivot_longer(cols = everything(), values_drop_na = TRUE) %>%
  group_by(value) %>%
  summarise(count = n_distinct(name))

#   value   count
#   <chr>   <int>
# 1 Alex        4
# 2 Barbara     1
# 3 Ben         4
# 4 Ken         1
# 5 Linda       2
# 6 Lisa        3
# 7 MJ          4
# 8 NA          3
# 9 Paul        2
#10 Tim         4
#11 Tomas       1

这里你在输出中得到 "NA" 因为它是一个字符串。如果你的数据有真实的 NA,它会因为 values_drop_na = TRUE.

而被丢弃

使用 aggregate + stack

的简单基础 R 选项
aggregate(.~values,unique(stack(df)),length)

这样

> aggregate(.~values,unique(stack(df)),length)
    values ind
1     Alex   4
2  Barbara   1
3      Ben   4
4      Ken   1
5    Linda   2
6     Lisa   3
7       MJ   4
8       NA   3
9     Paul   2
10     Tim   4
11   Tomas   1