【问题标题】:Renaming row values with column name and then aggregating it into one column using R使用列名重命名行值,然后使用 R 将其聚合为一列
【发布时间】:2020-01-20 16:37:41
【问题描述】:

我有一个行值为 0 和 1 的 data.frame。现在我需要将 1 替换为列名。稍后我需要将它们聚合到一列(因为单行中没有重复)。

数据框看起来像这样

var1   var2    var3 
0      1       0
1      0       0
0      0       1

预期输出

var1   var2    var3 var
0      var2    0    var2
var1   0       0    var1
0      0       var3 var3

【问题讨论】:

    标签: r


    【解决方案1】:

    任意数据框和目标值的基础 R 解决方案:

    df <- data.frame(
    var1  = c(0,1,0),
    var2 = c(1,0,0),
    var3 = c(0,0,1))
    
    # Task 1 
    val <- 1 # value to subsitute
    for (n in names(df)){
      df[[n]][df[[n]] == val] <- n
    }
    
    # Task 2
    df$var <- apply(df, 2, function(x) x[grepl("var", x)])
    

    【讨论】:

    • 我无法掌握任务2中的函数(x)。我应该从哪里了解它?感谢您的解决方案。
    • applyMARGIN = 2 应用我按行定义的函数。该函数返回括号内的条件为真的行的元素。 grepl 将搜索模式(“var”)并返回 TRUE/FALSE。在 R 控制台中输入 ?apply?grepl 以了解更多信息。
    • 感谢您提供解释。
    • 现在我意识到了 R 中 for 循环的强大功能。您提供了一个绝妙的解决方案。我已经改变了接受的答案。感谢您的回答@slava
    【解决方案2】:

    You should try gather() from the tidyr package.

    Gather 将使用 var-name 和 value 创建一列。之后,您可以过滤到仅值 1,然后删除值列。

    library(dplyr) # for piping
    library(tidyr) # for gather
    
    df %>%
    gather(var,value) %>% # the arguments simply name the output columns
    filter(value == 1) %>%
    select(-value)
    

    【讨论】:

    • gather 在为 NA 时未保留行值。它也没有保持行的完整性。
    【解决方案3】:

    您可以使用 ifelse 语句的组合将 1 替换为列名。

    例如

    df$var1 = ifelse(df$var1 == 1, "var1", 0)

    如果您想遍历多个列,您可以使用lapply 和列名列表使其更具可复制性,然后在ifelse 语句中使用names(df[x]) 而不是“var1” /p>

    【讨论】:

    • 这对于新手程序员来说很容易理解。
    猜你喜欢
    • 1970-01-01
    • 2019-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-24
    • 1970-01-01
    • 2017-03-06
    • 2021-04-18
    相关资源
    最近更新 更多