【问题标题】:For loop to rename all non-NA observations to column name in RFor循环将所有非NA观察重命名为R中的列名
【发布时间】:2019-12-17 09:56:03
【问题描述】:

我有一个非常混乱的数据结构,我正在尝试将列子集中的任何观察的名称重新分配为该列名。我想编写一个 for 循环,说明第 28:141 列中的所有 non.na 观察结果(必须用它们的编号而不是它们的标题来调用这些列),将观察名称重命名为该列名称。

示例数据结构

df <- data.frame(Id = c('x111', 'x222', 'x333', 'x444'), 
                    Ext =c("M", "L", "S","S"),
                    Ind1 = c('clean', NA, NA, 'clean'),
                    Ind2 = c(NA, 'medium', 'medium', NA),
                    Ind3 = c(NA, NA, 'tall', NA),
                    Ext2 = c(12, 15, 11, 9))

例如,如何将列 2:4 中的所有 non.na 观测值重命名为该特定列名称

【问题讨论】:

  • 试试df[2:4] &lt;- Map(function(x, y) replace(as.character(x), !is.na(x), y), df[2:4], names(df)[2:4])
  • 是的!这工作,非常感谢你!你能解释一下这里的逻辑吗?

标签: r for-loop rename


【解决方案1】:

或者你可以试试purrr包中的地图功能

df[2:4] <- purrr::map2_df(df[2:4],colnames(df[2:4]),function(x,y){
    ifelse(is.na(x),x,y)
})
> df
    Id Ext Ind1 Ind2 Ind3 Ext2
1 x111 Ext Ind1 <NA> <NA>   12
2 x222 Ext <NA> Ind2 <NA>   15
3 x333 Ext <NA> Ind2 tall   11
4 x444 Ext Ind1 <NA> <NA>    9

【讨论】:

    【解决方案2】:

    或者:

    df[2:4] <- purrr::imap_dfc(df[2:4], function(x, y) ifelse(is.na(x), x, y))
    

    【讨论】:

      【解决方案3】:

      由于您要求 for 循环(请注意,对于大 data.frames,这将相当慢):

      for(i in 2:4){
        if(F %in% is.na(df[, i])){
          df[which(!is.na(df[, i])), i] <- names(df)[i]
        }
      }
      

      这给我们留下了:

         Id Ext Ind1 Ind2 Ind3 Ext2
      1 x111 Ext Ind1 <NA> <NA>   12
      2 x222 Ext <NA> Ind2 <NA>   15
      3 x333 Ext <NA> Ind2 tall   11
      4 x444 Ext Ind1 <NA> <NA>    9
      

      【讨论】:

        【解决方案4】:

        我们可以从base R 使用Map。传入变量和对应的列作为输入,replace对应列名的列中的非NA元素

        df[2:4] <- Map(function(x, y) replace(as.character(x),
                  !is.na(x), y), df[2:4], names(df)[2:4])
        

        当我们将 data.frame 作为输入传递时,每一列都是一个单元,当它是 vector (names(df)[2:4]) 时,单元是每个元素。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-02
          • 1970-01-01
          • 2015-03-31
          • 2021-12-18
          • 2018-04-24
          • 1970-01-01
          • 2018-06-15
          • 2018-07-08
          相关资源
          最近更新 更多