Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 团队管理NA的整洁方式?_R_Group By_Na_Mutate_Tidy - Fatal编程技术网

R 团队管理NA的整洁方式?

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

我的问题如下:

我有一个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(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))