如何替换行不是全部NA的数据框行中的NA

时间:2019-08-22 09:18:42

标签: r

我有一个看起来像这样的数据框:

df <- data.frame(matrix(c(1,351,NA,1,0,2,585,0,1,1,3,321,NA,0,1,4,964,NA,NA,NA,5,556,0,1,NA), ncol = 5, byrow = TRUE))
colnames(df) <- c('id','value','v1','v2','v3')

现在,对于不是全部NA的所有行,我想用0(零)替换子集c('v1', 'v2', 'v3')中的所有NA。

所以我想要这个:

R> df
  id value v1 v2 v3
1  1   351 NA  1  0
2  2   585  0  1  1
3  3   321 NA  0  1
4  4   964 NA NA NA
5  5   556  0  1 NA

最终像这样:

R> df
  id value v1 v2 v3
1  1   351  0  1  0
2  2   585  0  1  1
3  3   321  0  0  1
4  4   964 NA NA NA
5  5   556  0  1  0

请注意,df[4, ]仍具有c('v1', 'v2', 'v3')的NA。

5 个答案:

答案 0 :(得分:2)

在基数R中,这是一种方法

#columns to check for NA
cols <- c("v1", "v2", "v3")
#rows which needs to be replaced
rows <- which(rowSums(is.na(df[cols])) != length(cols))
#Replace values which are NA to 0
df[rows, cols] <- replace(df[rows, cols], is.na(df[rows, cols]), 0)
df
#  id value v1 v2 v3
#1  1   351  0  1  0
#2  2   585  0  1  1
#3  3   321  0  0  1
#4  4   964 NA NA NA
#5  5   556  0  1  0

答案 1 :(得分:2)

这是一个具有良好旧循环的解决方案:

for (r in 1:nrow(df))
{
  # check that not the all row is na but that there are some na
  if(!all(is.na(df[r,3:5])) && sum(is.na(df[r,3:5]>0)))
  {
    df[r,which(is.na(df[r,3:5]))+2]=0
  }  
}

答案 2 :(得分:1)

使用<Button id="openDrawer" onClick={() => toggleDrawer(true)} style={{ margin: spacing.small }} > <AddIcon /> {buttonText} </Button> ,您可以尝试:

it("should open the drawer on button click", () => {
        wrapper.find("#openDrawer").simulate("click");
        expect(wrapper.state("drawerOpen")).toBetruthy();
});

答案 3 :(得分:1)

一个简单的dplyr解决方案:

library(tidyverse)

df %>% 
  mutate_at(vars(v1:v3), ~ifelse(is.na(v1) & is.na(v2) & is.na(v3), NA, replace_na(., 0)))

答案 4 :(得分:0)

尽可能简单:

df[ !(is.na(df$v1) & is.na(df$v2) & is.na(df$v3)) & is.na(df) ] <- 0