我对使用数据中的数值替换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
答案 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}}