将NA值替换为组中的数值

时间:2018-04-02 03:57:11

标签: r dataframe dplyr na

我对使用数据中的数值替换NA值有疑问。 如果组中的所有行都为NA,则将其替换为100和其他 如果组中有任何数值,则用这些数值替换NA s。

类似的帖子 How to copy value of a cell to other rows based on the value of other two columns?

replace NA value with the group value

但我宁愿直接使用dplyr解决方案,但这两个帖子都有zoo个解决方案!

df = data.frame(gr=gl(3,3),id=c("NA","NA","NA",131,"NA","NA",232,232,"NA"))

> df
  gr  id
1  1  NA
2  1  NA
3  1  NA
4  2 131
5  2  NA
6  2  NA
7  3 232
8  3 232
9  3  NA

看起来很简单所以我试过了,

library(dplyr)
df%>%
  group_by(gr)%>%
  mutate(id_new=ifelse(all(is.na(id)),100,ifelse(any(is.numeric(id)),id[which(is.numeric(id))],NA)))

# A tibble: 9 x 3
# Groups:   gr [3]
      gr     id id_new
  <fctr> <fctr>  <lgl>
1      1     NA     NA
2      1     NA     NA
3      1     NA     NA
4      2    131     NA
5      2     NA     NA
6      2     NA     NA
7      3    232     NA
8      3    232     NA
9      3     NA     NA

所有行都是NA为什么?

预期产出

      gr     id id_new
  <fctr> <fctr>  <lgl>
1      1     NA     100
2      1     NA     100
3      1     NA     100
4      2    131     131
5      2     NA     131
6      2     NA     131
7      3    232     232
8      3    232     232
9      3     NA     232

2 个答案:

答案 0 :(得分:2)

只需将=INDEX($A1:$A100,MATCH(0,IF($B1:$B100="No",COUNTIF($C$1:$C1,$A1:$A100),""),0)) 转换为id即可。另外,对于numeric的else条件,我使用了ifelese,以防值不唯一。把它改成适合你的任何东西。我认为不需要复杂的其他声明。

max

答案 1 :(得分:1)

此处的问题是,您的id列是factor,而不是数字,因此所有值都不会返回TRUE is.numeric()。这是因为您使用"character" NA值构建了它。使用"numeric" NA值构造它,如下所示:

df = data.frame(gr=gl(3,3),id=c(NA, NA,NA,131,NA,NA,232,232,NA))

df %>%
  group_by(gr) %>% mutate(id_new=ifelse(all(is.na(id)),100,ifelse(any(is.numeric(id)),id[which(is.numeric(id))],NA)))
# A tibble: 9 x 3
# Groups:   gr [3]
  gr       id id_new
  <fct> <dbl>  <dbl>
1 1        NA    100
2 1        NA    100
3 1        NA    100
4 2       131    131
5 2        NA    131
6 2        NA    131
7 3       232    232
8 3       232    232
9 3        NA    232

您无需执行任何特殊操作即可生成NA"numeric"。当您使用c()值传递"logical"时,"numeric"会强制它们"character"。之前,由于c()具有更高的优先级,"character""NA"包含NA而不是data.frame()"factor"时将该列强制转移到stringsAsFactors = TRUE由于默认{{1}}

,我们将其转换为{{1}}