【问题标题】:Conditional replacement while match on a variable匹配变量时的条件替换
【发布时间】:2019-11-30 12:09:38
【问题描述】:

我想替换特定子组中观察值的 NA 值,但该组中的观察顺序未正确排序。所以我想知道是否存在一些dplyrplyr 命令允许我使用来自另一个数据帧的同一列中的值替换属于一个数据帧的列中的缺失值,同时匹配该“键”的值"列。

这就是我得到的。希望有人可以阐明这一点。谢谢。

## data frame that contains missing values in "diff" column

df <- data.frame(type = c(1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3), 
diff = c(0.1, 0.3, NA, NA, NA, NA, NA, 0.2, 0.7, NA, 0.5, NA), 
name = c("A", "B", "C", "D", "E", "A", "B", "C", "F", "A", "B", "C"))

## replace with values from this smaller data frame

df2 <- data.frame(diff_rep = c(0.3, 0.2, 0.4), name = c("A", "B", "C"))

## replace using ifelse
df$diff <- ifelse(is.na(df$diff) & (df$type == 2), df2$diff_rep , df$diff)

df

   type diff name
1     1  0.1    A
2     1  0.3    B
3     1   NA    C
4     2  0.3    D
5     2  0.2    E
6     2  0.4    A
7     2  0.3    B
8     2  0.2    C
9     2  0.7    F
10    3   NA    A
11    3  0.5    B
12    3   NA    C

## desired output

   type diff name
1     1  0.1    A
2     1  0.3    B
3     1   NA    C
4     2   NA    D
5     2   NA    E
6     2  0.3    A
7     2  0.2    B
8     2  0.4    C
9     2  0.7    F
10    3   NA    A
11    3  0.5    B
12    3   NA    C

【问题讨论】:

  • 你能解释一下这些值是如何被替换的吗?我不清楚。我还看到第 9 行 0.7 被替换为 NA
  • 还有什么是## replace using ifelse 部分?它是你原来的df 的一部分吗?
  • 我的意思是 type 2 的 D E F 应该导致不匹配。它们应该在下面看起来像我想要的输出。
  • @Ronak,df 是实现itelse() 后的新数据框。
  • 那么当AB 出现在df2 中时,为什么ACNA for type 3? C 中的 type 1 相同吗?

标签: r if-statement replace dplyr na


【解决方案1】:

假设第 9 行是错误的,您可以先使用左连接,然后使用 ifelse()coalesce() 来获得所需的结果。 coalesce() 返回第一个非缺失值

left_join(df, df2, by = "name") %>% 
  mutate(diff_wanted = if_else(type == 2,
                               coalesce(diff, diff_rep),
                               diff),
         diff_wanted = ifelse(name %in% df2$name,
                              diff_wanted,
                              NA)) %>% 
  select(type, diff_wanted, name)

【讨论】:

  • name D, E, F 应该不匹配,因为 df2 不包含 name D, E, F 的值。
  • 我想我明白了,只要使用 df$diff &lt;- df2$diff[match(df$name, df2$name)] 就可以了。
  • 我添加了另一个 ifelse 子句
  • 嗨@mnist,type 2 的 F 结果为 NA,而它应该是 0.7。
  • 是的,你是对的,我没有注意到我错误地编码了 obs 9(type2 的 F)。请接受我的道歉。
猜你喜欢
  • 2020-12-01
  • 2022-07-08
  • 2020-09-14
  • 2010-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-06
  • 1970-01-01
相关资源
最近更新 更多