【问题标题】:Changing NA only in subset in column of data frame based on conditions根据条件仅在数据框列的子集中更改 NA
【发布时间】:2021-10-16 13:01:01
【问题描述】:

我有来自多个数组的数据。我想更改仅属于存在部分数据的数组的数据帧中的 NA。其他数据应保持 NA。我有一个 2 数组的示例,但它可以是多个数组。

 data_frame = data.frame(
  col1 = c(111,232,12,NA, NA, NA, NA, NA, NA, NA,NA,NA),
  col2 = c(NA,NA,NA,4,50,800,NA,NA,NA,NA,NA,NA),
  col3 = c(NA,NA,NA,NA,NA,NA,NA,NA,NA,20,3,500),
  ARRAY = c(1,1,1,2,2,2,1,1,1,2,2,2))

所以,它应该看起来像在 col1 中替换了第 7-9 行中的 NA,在 col2 中替换了第 10-12 行中的 NA,在 col3 中第 4-6 行中......

我试图找出哪些行和列的数据与 which(!is.na(data_frame), arr.ind = TRUE) 但后来我卡住了。对于我有多个数组的任何脚本,这应该是通用的,并且只有在数组有部分数据时才想更改 NA。

顺序不应该改变,因为它需要放回一个大的数据框集。

经过一番尝试,我想出了这个:

for (j in 1:3){ 

A <- as.data.frame(df[,j]) 
NonNAindex <- which(!is.na(A)) 
NonNA <- min(NonNAindex) 
ARRAY <- df[firstNonNA,ncol(df)] 

for (r in 1:nrow(df)){ 

if (is.na(df[r,j]) & df[r,4]==ARRAY) {df[r,j] <- 0} 
else{df[r,j] <- df[r,j]}
} 
}

【问题讨论】:

    标签: r dataframe grouping subset na


    【解决方案1】:

    你可以试试下面的代码

    df[-4] <- lapply(
      df[-4],
      function(x) {
        ave(x,
          df$ARRAY,
          FUN = function(v) if (all(is.na(v))) NA else replace(v, is.na(v), 1)
        )
      }
    )
    

    给了

    > df
       col1 col2 col3 ARRAY
    1   111   NA   NA     1
    2   232   NA   NA     1
    3    12   NA   NA     1
    4    NA    4    1     2
    5    NA   50    1     2
    6    NA  800    1     2
    7     1   NA   NA     1
    8     1   NA   NA     1
    9     1   NA   NA     1
    10   NA    1   20     2
    11   NA    1    3     2
    12   NA    1  500     2
    

    【讨论】:

    • 谢谢!这比我想出的要短得多 -> '##LOOP over the columns 1:3 for (j in 1:3){ ##get single column data A
    • 显然,我不知道如何在评论中格式化代码...对不起!
    • @denfly 也许你可以把它放在你的问题帖子中以展示你的尝试。
    【解决方案2】:

    类似于@ThomasIsCoding 在dplyr 中的回答-

    library(dplyr)
    
    data_frame %>%
      group_by(ARRAY) %>%
      mutate(across(starts_with('col'), 
              ~if(all(is.na(.))) NA else replace(., is.na(.), 1))) %>%
      ungroup
    
    #    col1  col2  col3 ARRAY
    #   <dbl> <dbl> <dbl> <dbl>
    # 1   111    NA    NA     1
    # 2   232    NA    NA     1
    # 3    12    NA    NA     1
    # 4    NA     4     1     2
    # 5    NA    50     1     2
    # 6    NA   800     1     2
    # 7     1    NA    NA     1
    # 8     1    NA    NA     1
    # 9     1    NA    NA     1
    #10    NA     1    20     2
    #11    NA     1     3     2
    #12    NA     1   500     2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-01
      • 1970-01-01
      • 2021-03-08
      • 2023-02-21
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多