如何在R中的数据框的其他行中查找元素
Posted
技术标签:
【中文标题】如何在R中的数据框的其他行中查找元素【英文标题】:How to find an element in other rows of a dataframe in R 【发布时间】:2020-12-01 02:00:15 【问题描述】:有人可以帮我解决 R 中的这个问题吗?这是我正在使用的示例数据:
df <- data.frame(item = c("x", "y", "z"),
code1 = c("3 9 27 45 88 98", "23", "12 45"),
code2 = c("45 88 98 99 102 159", "42", "27 0 99"))
df
数据框如下所示:
item code1 code2
1 x 3 9 27 45 88 98 45 88 98 99 102 159
2 y 23 42
3 z 12 45 27 0 99
我想找到变量code1
的每个元素到code2
但不在同一行。例如,观察 1 有一个元素 27,它存在于观察 3 中,因此新变量必须将其记录为计数 1。如果观察在除当前观察之外的任何其他观察中具有多个元素,则代码应计数商场。同样,观察 3 在观察 1 中有元素 45,因此新变量会将其记录为计数 1。最后,第二个观察元素不存在于任何其他观察中,因此新变量应计为 0。这是预期结果:
item code1 code2 code3
1 x 3 9 27 45 88 98 45 88 98 99 102 159 1
2 y 23 42 0
3 z 12 45 27 0 99 1
我尝试过,使用which(code1 %in% code2)
,使用 for 循环遍历 code1 的元素并搜索到 code2,将 sapply 与 index 比当前索引小 1 的函数一起使用,但这些尝试都没有结果。
谢谢。
【问题讨论】:
【参考方案1】:您不能直接使用%in%
,因为%in%
在code1
和code2
中寻找完全匹配,而您需要的是单独检查每个数字。您可以在空白处拆分 code1
和 code2
,迭代它们的索引,对于 lst1
中的每个索引,从 lst2
中删除相应的值,并使用 %in%
计算公共值。
lst1 <- strsplit(df$code1, '\\s+')
lst2 <- strsplit(df$code2, '\\s+')
df$code3 <- sapply(seq_along(lst1), function(x)
sum(lst1[[x]] %in% unlist(lst2[-x])))
df
# item code1 code2 code3
#1 x 3 9 27 45 88 98 45 88 98 99 102 159 1
#2 y 23 42 0
#3 z 12 45 27 0 99 1
如果您使用的是 R
df[] <- lapply(df, as.character)
【讨论】:
【参考方案2】:library(tidyverse)
df <- data.frame(item = c("x", "y", "z"),
code1 = c("3 9 27 45 88 98", "23", "12 45"),
code2 = c("45 88 98 99 102 159", "42", "27 0 99"))
df1 <- df %>%
select("item1" = item, code1) %>%
mutate(code1 = str_split(code1, pattern = " ")) %>%
unnest
df2 <- df %>%
select("item2" = item, code2) %>%
mutate(code2 = str_split(code2, pattern = " ")) %>%
unnest
df3 <- crossing(df1, df2) %>%
filter(item1 != item2) %>%
mutate(code3 = code1 == code2) %>%
select("item" = item1, code3) %>%
group_by(item) %>%
summarise(code3 = sum(code3)) %>% ungroup()
df_out <- inner_join(df, df3)
【讨论】:
以上是关于如何在R中的数据框的其他行中查找元素的主要内容,如果未能解决你的问题,请参考以下文章
在Pandas中,我如何将一个函数应用到数据框的某一行,其中行中的每一项都应该作为参数传递给函数?