【问题标题】:Get the latest updated value in R获取 R 中的最新更新值
【发布时间】:2021-10-04 19:40:09
【问题描述】:

我想在此 (Get the latest updated value based on other columns) 之后提出另一个问题,因为我的问题可能不清楚。

最初,我有 2 个数据框,其中一个在 name2 列中包含 NA 值,另一个在 name1 列中包含 NA 值。然后,我在这里使用bind_rows 获取一个大数据框作为示例。 name3 列是name1name2 的组合。

name1               name2                  name3
Acer laurinum        NA                     Acer laurinum
Acmella paniculata   NA                     Acmella paniculata
Aglaia lawii         NA                     Aglaia lawii
............         NA                     ...................
NA                   Acer laurinum Hassk.   Acer laurinum Hassk.
NA                   Aglaia lawii (Wight)   Aglaia lawii (Wight)
NA                   ....................   ....................                  

如您所见,name3 列中的几个名称缺少作者部分。这就是为什么我想根据name2name3 列更新这些名称。 使用tidyverse对我有什么建议吗?

代码示例

df <- data.frame(
name1 = c("Acer laurinum", "Acmella paniculata", "Aglaia lawii", NA, NA), 
name2 = c(NA, NA, NA, "Acer laurinum Hassk.", "Aglaia lawii (Wight)"),
name3 = c("Acer laurinum", "Acmella paniculata", "Aglaia lawii", "Acer laurinum Hassk.", "Aglaia lawii (Wight)"))

我想要的输出

name1               name2                  name3
Acer laurinum        NA                     Acer laurinum Hassk.
Acmella paniculata   NA                     Acmella paniculata
Aglaia lawii         NA                     Aglaia lawii (Wight)
NA                   Acer laurinum Hassk.   Acer laurinum Hassk.
NA                   Aglaia lawii (Wight)   Aglaia lawii (Wight)

【问题讨论】:

  • 好的,我想我对您的预期感到困惑。我以为name3 不存在于数据中
  • 哦,我明白了。我之前确实创建了一个好名字的向量,然后我使用lapply 来绑定作者姓名,就像这篇文章一样。 (stackoverflow.com/questions/68637196/…)。但是,在某些情况下,当我匹配出错时,我认为这可能不是一个好的选择

标签: r tidyverse


【解决方案1】:

你可以这样做: 想法:

  1. 以长格式提供数据
  2. 使用来自stringrword 使用名称的第一个单词创建一个helper
  3. helpermutate 值与组的最后一个值分组
  4. 恢复宽幅格式
library(dplyr)
library(stringr)

df %>% 
  mutate(id = row_number()) %>% 
  pivot_longer(
    cols = -id
  ) %>% 
  mutate(helper= word(value, 1)) %>% 
  group_by(helper) %>% 
  mutate(value= last(value)) %>% 
  pivot_wider(
    names_from = name,
    values_from = value
  ) %>% 
  ungroup() %>% 
  select(-id, -helper) %>% 
  filter(if_any(everything(), ~ !is.na(.)))
  name1                name2                name3               
  <chr>                <chr>                <chr>               
1 Acer laurinum Hassk. NA                   Acer laurinum Hassk.
2 Acmella paniculata   NA                   Acmella paniculata  
3 Aglaia lawii (Wight) NA                   Aglaia lawii (Wight)
4 NA                   Acer laurinum Hassk. Acer laurinum Hassk.
5 NA                   Aglaia lawii (Wight) Aglaia lawii (Wight)

【讨论】:

  • 非常感谢。它在这里运作良好。然而,当我运行我的数据时,发生了一些奇怪的事情。该行不再相同,由于某些原因增加了。例如,name1name3 具有良好解决方案的几个唯一行拆分为 2 个不同的行
  • 也许您可以将其创建为一个新问题。看来值得处理!
  • 谢谢。当我们创建value 列时发生了问题,一些id 匹配错误的名称。我将创建一个新主题
猜你喜欢
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
  • 2021-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多