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