如何在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%code1code2 中寻找完全匹配,而您需要的是单独检查每个数字。您可以在空白处拆分 code1code2,迭代它们的索引,对于 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中,我如何将一个函数应用到数据框的某一行,其中行中的每一项都应该作为参数传递给函数?

我正在尝试在另一个数据框的列中查找数据框中的列的元素,但 index() 对我不起作用

根据R中数据框的数字列查找样本拆分中的重叠

如何在文本框的文本中添加新行?

如何在记事本++中的书签行中查找和替换

如何根据R中的最后一行在所选行中添加前缀