如何检查可以找到多少列字符[重复]

Posted

技术标签:

【中文标题】如何检查可以找到多少列字符[重复]【英文标题】:How to check in how many columns character can be found [duplicate] 【发布时间】:2020-11-24 13:59:37 【问题描述】:

我有一个包含 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 列(A 类名称)、4 列中的 3 列(B 类名称)和 4 列中的 2 列(C 类名称)中找到的名称。

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

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

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

Name Class
Ben    A
Lisa   B

有没有更好的方法来根据可以找到的列数对唯一名称进行分类,以及如何对 B 和 C 类名称进行分类?

提前致谢!

【问题讨论】:

对不起!我为较短的列添加了一些“NA”行。所以它现在更像原始数据。 ***.com/questions/63235393/… 您创建了一个带有类似问题的主题。看答案。合适吗? table(unlist(lapply(df, levels)))(如果这些是因素)或table(unlist(lapply(df, unique)))(如果这些是字符)是另一种选择 【参考方案1】:

这是一个基于 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 

【讨论】:

感谢您的回答!但我需要知道至少可以在多少列中找到名称一次。所以对于 Ben,它应该是 4,因为 Ben 可以在所有 4 列中找到(至少一次)。你知道解决方案吗?【参考方案2】:

您可以获取长格式的数据,并为每个名称找出它出现的唯一列:

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 而被丢弃。

【讨论】:

嘿,非常感谢!这是我问题的完美解决方案!您是否认为我可以从中创建一个 for 循环并将其应用于多个数据集,比如说 5 (df1, df2, df3, df4, df5)?你也知道解决方案吗? 把上面的代码放在一个函数中(比如fun)。然后将所有数据框放在一个列表中,lst_data &lt;- list(df1, df2...) 并使用map(lst_data, fun)【参考方案3】:

使用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

【讨论】:

这在我的 R 会话中不起作用。我得到Error in stack.data.frame(df) : no vector columns were selected @DavidArenburg 这很奇怪......你的 R 版本是什么?我的是 Win 10 中的 4.0.2 对,应该是R版本,我还没升级到4呢

以上是关于如何检查可以找到多少列字符[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 Bigquery 中两个字符串共有多少个单词?

如何检查一个元素在列表中存在多少次[重复]

如何计算bash中一列数据中的连续重复次数?

excel统计一个区域里共有多少个数

ififcount显示重复行另一列内容

如何检查字符串中的三个或更多空格 - Python [重复]