如何检查可以找到多少列字符
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
我有一个包含 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
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