对于每一行,找到与特定字符串匹配的单元格并返回列名的最后一个字符

vuca438

下面是一些示例数据。每一行都是不同的参与者。每个参与者完成五次试验。在每次试验中,他们从一组 10 个水果中挑选一个水果(不更换)。

ID 试用_1 试用_2 试用_3 试用_4 试用_5
01 苹果 橘子 香蕉 葡萄
02 葡萄 西瓜 芒果
03 葡萄 芒果 橘子 香蕉
04 西瓜 苹果 葡萄
05 香蕉 苹果 葡萄 芒果

我想创建 10 个新列——每个水果一个——其中包含试用号(如果没有试用号,则为“NA”):

ID 试用_1 试用_2 试用_3 试用_4 试用_5 苹果 香蕉 葡萄 芒果 橘子 草莓 西瓜
01 苹果 橘子 香蕉 葡萄 1 不适用 3 5 不适用 2 4 不适用 不适用 不适用
02 葡萄 西瓜 芒果 不适用 5 不适用 1 3 不适用 4 不适用 不适用 2
03 葡萄 芒果 橘子 香蕉 不适用 不适用 5 2 3 4 不适用 1 不适用 不适用
04 西瓜 苹果 葡萄 2 不适用 不适用 4 不适用 不适用 3 5 不适用 1
05 香蕉 苹果 葡萄 芒果 3 不适用 1 4 5 不适用 2 不适用 不适用 不适用

我可以像这样为每个水果列这样做,但它看起来很笨重:

mutate(apple = ifelse(trial_1 == "apple", 1,
               ifelse(trial_2 == "apple", 2,
               ifelse(trial_2 == "apple", 3,
               ifelse(trial_2 == "apple", 4
               ifelse(trial_2 == "apple", 5, "NA"))))))

我认为有一个更简单、更简洁的解决方案,可能rowwise()用于匹配水果名称,然后只返回列名称的最后一个字符(即数字)。但我就是无法解决。你能帮忙吗?

乔恩·斯普林
library(tidyverse)
df %>%
  pivot_longer(-ID) %>%
  mutate(name = parse_number(name)) %>%
  pivot_wider(names_from = value, values_from = name)

这将给出右侧的列。要将这些附加到原始文件中,

left_join(df, 
    # the code above
)

结果

Joining, by = "ID"
# A tibble: 5 x 15
  ID    trial_1    trial_2    trial_3 trial_4 trial_5 apple orange banana peach grapes watermelon mango apricot  pear
  <chr> <chr>      <chr>      <chr>   <chr>   <chr>   <dbl>  <dbl>  <dbl> <dbl>  <dbl>      <dbl> <dbl>   <dbl> <dbl>
1 01    apple      orange     banana  peach   grapes      1      2      3     4      5         NA    NA      NA    NA
2 02    grapes     watermelon mango   peach   apricot    NA     NA     NA     4      1          2     3       5    NA
3 03    pear       grapes     mango   orange  banana     NA      4      5    NA      2         NA     3      NA     1
4 04    watermelon apple      peach   grapes  pear        2     NA     NA     3      4          1    NA      NA     5
5 05    banana     peach      apple   grapes  mango       3     NA      1     2      4         NA     5      NA    NA

源数据:

tibble::tribble(
   ~ID,     ~trial_1,     ~trial_2, ~trial_3, ~trial_4,  ~trial_5,
  "01",      "apple",     "orange", "banana",  "peach",  "grapes",
  "02",     "grapes", "watermelon",  "mango",  "peach", "apricot",
  "03",       "pear",     "grapes",  "mango", "orange",  "banana",
  "04", "watermelon",      "apple",  "peach", "grapes",    "pear",
  "05",     "banana",      "peach",  "apple", "grapes",   "mango"
  ) -> df

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何找到一个字符串的最后一个字

如何使用vim删除每一行的最后一个字符

如何在Vim的每一行末尾添加一个字符串?

每5个字符分割一个字符串

在同一行中多次匹配一个字符串模式

在单元格数组的所有字符串的每个字符之间放置一个字符

返回Python中字符串的最后一个字符

计算最后一行中包含一个字符串的文件数

Python:Pandas将每一行连接成一个字符串

字符串中的最后一个字符完全匹配

熊猫:一个字符串在数据框单元格中出现几次?

如何在一行中第一个字符后匹配字符串

如果一个字符串在特定文件的最后一行的开头匹配,则替换同一行中的另一字符串。

如何检索特定字符串之前的最后一个字符数组

在单元格中包含一个字符串

如何从一行中找到一个字符串并删除整行

如何在Excel单元格的每一行末尾附加一个字符?

如何在TSQL中匹配字符串的最后一个字符?

插入回车符,每64个字符返回一个字符串

在单元格中找到一个字符串并编辑该vb.net

将一个单元格中的最后一个字符移动到另一个单元格的开头

匹配特殊字符之间的最后一个字符串

如何检索由特殊字符串分隔的单元格的最后一个字符串

返回一个字符串

我想在文件中找到一行并替换一个字符串

删除每一行的最后一个字符

函数包含特定字符串返回一个字符串

在 Pandas Dataframe 的每一行中搜索一个字符串并返回找到的列名

使用 VBA 删除单元格中的最后一个字符