【问题标题】:Change value in column R更改 R 列中的值
【发布时间】:2017-03-21 19:03:22
【问题描述】:

我有一个如下子集的数据集

    col1   col2   col3
     y      
            y
     y      y
                   y
            y
     y

实际上,我的数据集描述的是药物过量。在每个人死亡时系统中的药物列中都有一个“y”。我想要做的是将“y”更改为相应的列。 例如,我希望上面的示例数据集显示为

    col1   col2   col3
    col1      
           col2
    col1   col2
                  col3
           col2
    col1

这样我以后可以结合这三列来了解每个人死于什么,但只查看一列。 数据集称为“Data1”,所以我知道我需要在某个时候放

    Data1$col1
    Data1$col2
    Data1$col3

有人请帮忙..我对此很陌生。

【问题讨论】:

标签: r


【解决方案1】:

如果您为患者 ID 添加一列,您可以使用 data.tablemelt 函数重新格式化为长格式:

df <- data.frame(id = 1:6, col1 = c("y", NA, "y", NA, NA, "y"),
                 col2 = c(NA, "y", "y", NA, "y", NA),
                 col3 = c(NA, NA, NA, "y", NA, NA))

df1 <- melt(setDT(df), id.vars = "id", measure.vars = c("col1", "col2", "col3"))
df1 <- df1[order(id)][is.na(value) == FALSE]

那会给你这个:

> df1
   id variable value
1:  1     col1     y
2:  2     col2     y
3:  3     col1     y
4:  3     col2     y
5:  4     col3     y
6:  5     col2     y
7:  6     col1     y

【讨论】:

    【解决方案2】:

    在列中,您可以检查值的位置并取回接下来用于索引该列的逻辑向量。在我们的例子中:

    Data1$col1 == "y"
    

    会给你一个类似的向量

    ## [1] TRUE FALSE TRUE FALSE FALSE TRUE
    

    您可以使用它来访问列中的“y”:

    Data1$col1[Data1$col1 == "y"]
    ## [1] "y" "y" "y"
    

    它只在有“y”的地方读出列的条目,在这种情况下有点无聊,但总的来说非常有用,比如当你使用一列中的值来操作另一列时。上面的行也是双向的:您可以读出值(如上),我们可以使用赋值运算符为指定的条目分配新值:

    Data1$col1[Data1$col1 == "y"] = "col1"
    

    然后您可以为每一列重复代码并完成。

    【讨论】:

      【解决方案3】:

      我想通了:

          Data1$Col1 <- as.character(Data1$Col1)
          Data1$Col1[Data1$Col1 %in% "y"] <- "Col1"
      

      感谢您的所有帮助!

      【讨论】:

        【解决方案4】:

        已经有一些绝妙的答案,但我仍然在这里写下我的解决方案,包括列循环:

        df <- data.frame(col1 = c("y", NA, "y", NA, NA, "y"),
                         col2 = c(NA, "y", "y", NA, "y", NA),
                         col3 = c(NA, NA, NA, "y", NA, NA), stringsAsFactors=FALSE)
        

        注意:stringAsFactors=FALSE 很重要!

        for (name in colnames(df)){
          df[name][df[name]=="y"] = name
        }
        

        然后,你会得到你想要的:

        > df
        
          col1 col2 col3
        1 col1 <NA> <NA>
        2 <NA> col2 <NA>
        3 col1 col2 <NA>
        4 <NA> <NA> col3
        5 <NA> col2 <NA>
        6 col1 <NA> <NA>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-12-22
          • 2018-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多