R 团队管理NA的整洁方式?
我的问题如下: 我有一个TIBLE,我想用3种不同的情况对其进行修改: 组中的所有值均为NA 至少有一个,但不是全部是NA。在这种情况下,将NA替换为任意值ex:0.5 没有一个是NA 示例:按ind分组 A组段应产生c0.3,0.1,0.5,0.7,0.2 B组的片段应产生repNA,5 C组的部分应保持不变 我尝试过if、ifelse和case_when语句,但我认为我遗漏了一些非常明显的东西。感谢所有帮助。编辑: 这里有一个简单的方法,尽管我知道有一个更简洁的方法:R 团队管理NA的整洁方式?,r,group-by,na,mutate,tidy,R,Group By,Na,Mutate,Tidy,我的问题如下: 我有一个TIBLE,我想用3种不同的情况对其进行修改: 组中的所有值均为NA 至少有一个,但不是全部是NA。在这种情况下,将NA替换为任意值ex:0.5 没有一个是NA 示例:按ind分组 A组段应产生c0.3,0.1,0.5,0.7,0.2 B组的片段应产生repNA,5 C组的部分应保持不变 我尝试过if、ifelse和case_when语句,但我认为我遗漏了一些非常明显的东西。感谢所有帮助。编辑: 这里有一个简单的方法,尽管我知道有一个更简洁的方法: library(dpl
library(dplyr)
df %>%
group_by(ind) %>%
mutate_if(is.logical, as.numeric) %>%
mutate(a1 = case_when(is.na(a1) & sum(is.na(a1)) < length(a1) ~ 0.5, TRUE ~ a1),
a2 = case_when(is.na(a2) & sum(is.na(a2)) < length(a2) ~ 0.5, TRUE ~ a2),
a3 = case_when(is.na(a3) & sum(is.na(a3)) < length(a3) ~ 0.5, TRUE ~ a3))
df2
编辑:
这里有一个简单的方法,尽管我知道有一个更简洁的方法:
library(dplyr)
df %>%
group_by(ind) %>%
mutate_if(is.logical, as.numeric) %>%
mutate(a1 = case_when(is.na(a1) & sum(is.na(a1)) < length(a1) ~ 0.5, TRUE ~ a1),
a2 = case_when(is.na(a2) & sum(is.na(a2)) < length(a2) ~ 0.5, TRUE ~ a2),
a3 = case_when(is.na(a3) & sum(is.na(a3)) < length(a3) ~ 0.5, TRUE ~ a3))
df2
一种使用case_的方法
示例数据
a1 = c(0.3,0.1,NA,0.7,0.2)
a2 = rep(NA,5)
a3 = c(0.1,0.3,0.5,0.7,0.8)
df <- tibble(ind = c(rep("A",5),rep("B",5),rep("C",5)),
value = c(a1,a2,a3))
一种使用case_的方法
示例数据
a1 = c(0.3,0.1,NA,0.7,0.2)
a2 = rep(NA,5)
a3 = c(0.1,0.3,0.5,0.7,0.8)
df <- tibble(ind = c(rep("A",5),rep("B",5),rep("C",5)),
value = c(a1,a2,a3))
我可能表达错误了。0.5不是因为它恰好是最后一个值,而是一个任意数。为清晰起见,将进行编辑。更改了clarity的示例我可能表达错误。0.5不是因为它恰好是最后一个值,而是一个任意数。为清晰起见,将进行编辑。更改了clarity的示例,因此您只想将a1中的NA值替换为0.5?正确,但是如果整个组为NA或其中没有一个是保留所有NAs或保留所有值。因此,您只想将a1中的NA值替换为0.5?正确,但是如果整个组为NA或没有一个是保留所有NAs或保留所有值。
ind a1 a2 a3
<chr> <dbl> <dbl> <dbl>
1 A 0.3 NA 0.1
2 A 0.5 NA 0.3
3 A 0.5 NA 0.5
4 A 0.7 NA 0.7
5 A 0.2 NA 0.8
6 B 0.5 NA 0.1
7 B 0.5 NA 0.3
8 B 0.5 NA 0.5
9 B 0.5 NA 0.7
10 B 0.2 NA 0.8
structure(list(ind = c("A", "A", "A", "A", "A", "B", "B", "B",
"B", "B"), a1 = c(0.3, 0.5, NA, 0.7, 0.2, NA, 0.5, NA, NA, 0.2
), a2 = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA), a3 = c(0.1,
0.3, 0.5, 0.7, 0.8, 0.1, 0.3, 0.5, 0.7, 0.8)), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"))
df %>%
group_by(ind) %>%
mutate(value2 = case_when(
!all(is.na(value)) & is.na(value) ~ 0.5,
TRUE ~ value
))
#-----
# A tibble: 15 x 3
# Groups: ind [3]
ind value value2
<chr> <dbl> <dbl>
1 A 0.3 0.3
2 A 0.1 0.1
3 A NA 0.5
4 A 0.7 0.7
5 A 0.2 0.2
6 B NA NA
7 B NA NA
8 B NA NA
9 B NA NA
10 B NA NA
11 C 0.1 0.1
12 C 0.3 0.3
13 C 0.5 0.5
14 C 0.7 0.7
15 C 0.8 0.8
a1 = c(0.3,0.1,NA,0.7,0.2)
a2 = rep(NA,5)
a3 = c(0.1,0.3,0.5,0.7,0.8)
df <- tibble(ind = c(rep("A",5),rep("B",5),rep("C",5)),
value = c(a1,a2,a3))