【问题标题】:How to move values between columns with condition如何在有条件的列之间移动值
【发布时间】:2020-06-28 11:49:49
【问题描述】:

仅当 I 列上的行显示 NA 时,我想将值从列 II 移动到列 I。

这是data.frame:

id <- c("A","B","C","D", "E","F","G")
I <- c("NA","NA","NA","10","20","NA","30")
II <- c("3","4","5","6","7", "8", "8")
df <- data.frame(id, I, II)

预期的结果是这样的:

id <- c("A","B","C","D", "E","F","G")
I <- c("NA","NA","NA","10","20","NA","30")
II <- c("3","4","5","6","7", "8", "8")
III <- c("3","4","5","10","20", "8", "30")
df <- data.frame(id, I, II,III)

提前致谢!

【问题讨论】:

    标签: r


    【解决方案1】:

    你可以使用ifelse

    transform(df, III = ifelse(I == 'NA', II, I))
    
    #  id  I II III
    #1  A NA  3   3
    #2  B NA  4   4
    #3  C NA  5   5
    #4  D 10  6  10
    #5  E 20  7  20
    #6  F NA  8   8
    #7  G 30  8  30
    

    【讨论】:

      【解决方案2】:

      在一行中将引用的“NA”转换为实际未引用的NA 后,我们可以使用简单的coalesce

      library(dplyr)
      df1 <- df %>% 
                  mutate(III = coalesce(na_if(I, "NA"), II))
      df1
      #   id    I II III
      #1  A <NA>  3   3
      #2  B <NA>  4   4
      #3  C <NA>  5   5
      #4  D   10  6  10
      #5  E   20  7  20
      #6  F <NA>  8   8
      #7  G   30  8  30
      

      或者使用base R,将“NA”更改为NA,根据'I'中NA元素的存在创建一个逻辑向量来更改'III'的值(在分配'二'

      df$I[df$I == "NA"] <- NA
      df$III <- df$II
      df$III[!is.na(df$I)]  <- df$I[!is.na(df$I)]
      

      ifelse

      df$III <- with(df, ifelse(I == "NA", II, I))
      

      【讨论】:

        【解决方案3】:

        Base R 中的一个简单 for 循环将完成此操作

        III = 0
        
        for (i in 1:length(id)){
          if (I[i] == "NA"){
            III[i] = II[i]} else {
              III[i] = I[i]}
        }
        
        df = data.frame(id, I, II, III)
        

        【讨论】:

          猜你喜欢
          • 2015-04-20
          • 1970-01-01
          • 1970-01-01
          • 2022-01-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多