【问题标题】:Trying to match strings from multiple columns and create pair list where matches are found尝试匹配来自多列的字符串并创建找到匹配项的配对列表
【发布时间】:2022-01-19 17:19:55
【问题描述】:

我有两个带有字符串值的数据框:

df1 <- data.frame(values = c("apples_x", "oranges_z", "bananas_y", "berries_u", "melons_r"))

df2 = data.frame(values  = c('apples','oranges','z','pears','x','bananas','plums','y','h','grapes','q')) 

我想在两个数据帧之间进行成对比较,方法是遍历数据帧 2 的每一行,并分配 df1 值的水果和字母都出现在 df2 中的对号。 我想创建一个新的数据框来存储找到的匹配项的对号。 理想情况下,它看起来像这样:

df3 %>% head()
  values  paired
  <ch>     <int>
1 apples      1         
2 x           1          
3 oranges     2          
4 z           2          
5 bananas     3          
6 y           3 

我试图将 df1 中的值分成两个字符串,但我得到的字符串与任何字符都匹配。

lapply(df2, FUN=function(x){any(df1==x[[1]] & df1==x[[2]])})

【问题讨论】:

  • 我已编辑您的代码以将数据包含为 data.frame,这就是文本所暗示的。如果不正确,请重新编辑。
  • 你如何获得2oranges? (例如。)
  • 您是否正在寻找某种索引。然后df1 %&gt;% mutate(paired = row_number()) %&gt;% separate_rows(values) 正如其他人评论的那样,示例中的匹配数没有给出预期的输出
  • 抱歉,为了清楚起见,我已经编辑了帖子

标签: r string


【解决方案1】:

根据更新,我们可以filter将'df1'中的列拆分后,然后创建一个序列索引并reshape为'long'格式

library(dplyr)
library(tidyr)
df1  %>% 
  separate(values, into = c('values1', 'values2')) %>% 
  filter(if_all(everything(), ~ .x %in% df2$values)) %>%
  mutate(paired = row_number()) %>% 
  pivot_longer(cols = -paired, values_to = 'value', names_to = NULL) %>%
  select(value, paired)

-输出

# A tibble: 6 × 2
  value   paired
  <chr>    <int>
1 apples       1
2 x            1
3 oranges      2
4 z            2
5 bananas      3
6 y            3

【讨论】:

    猜你喜欢
    • 2020-02-29
    • 2019-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-02-24
    • 2018-07-11
    • 2019-09-21
    • 1970-01-01
    • 2020-05-14
    相关资源
    最近更新 更多