【问题标题】:How to find an element in other rows of a dataframe in R如何在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 的函数一起使用,但这些尝试都没有结果。

谢谢。

【问题讨论】:

    标签: r dataframe


    【解决方案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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-06-26
        • 1970-01-01
        • 1970-01-01
        • 2021-01-27
        • 1970-01-01
        • 2012-03-24
        • 2020-06-16
        • 1970-01-01
        相关资源
        最近更新 更多