【问题标题】:replace column entries by their column names用列名替换列条目
【发布时间】:2017-04-08 18:33:40
【问题描述】:

我想用它的列名替换 data.table 或 data.frame 中的一个值(即“x”)。

例子:

# sample data
Substance <- LETTERS[1:10]
Jan10 <- c("x","x",NA,NA,NA,"x","x","x","x",NA)
Apr10 <- c("x",NA,"x",NA,"x","x","x","x",NA,"x")
Jul10 <- c(NA,NA,NA,"x","x","x","x",NA,"x","x")
Oct10 <- c("x","x","x","x",NA,"x",NA,"x",NA,"x")

dt <- as.data.table(cbind(Substance, Jan10, Apr10, Jul10, Oct10))

# manually changing one column
dt[Jan10=="x", Jan10 := "Jan10"]

目标:所有列应与更改后的 Jan10 列相似。如何用相应的列名替换每列中的“x”值?感谢您的任何建议。

【问题讨论】:

  • 如果你有一个data.frame 并且列不是因素,你可以做indx &lt;- which(is.na(df), arr.ind = TRUE) ; df[indx] &lt;- names(df)[indx[, "col"]]
  • 确实我有因素。有用。如下所示,这个想法是替换“x”,而不是 NA。
  • 因此将is.na(df) 更改为df == "x",如果您打算将来更改值,最好不要使用因子(或cbind)。我读到你的数据如下df &lt;- data.frame(Substance, Jan10, Apr10, Jul10, Oct10, stringsAsFactors = FALSE)
  • 对不起,想写字符而不是因子。工作。

标签: r dataframe replace data.table


【解决方案1】:

我们遍历列,使用set 将NA 值替换为列名

for(j in 2:ncol(dt)){
    set(dt, i=which(dt[[j]]=="x"), j=j, value = names(dt)[j])
 }

dt
#    Substance Jan10 Apr10 Jul10 Oct10
# 1:         A Jan10 Apr10    NA Oct10
# 2:         B Jan10    NA    NA Oct10
# 3:         C    NA Apr10    NA Oct10
# 4:         D    NA    NA Jul10 Oct10
# 5:         E    NA Apr10 Jul10    NA
# 6:         F Jan10 Apr10 Jul10 Oct10
# 7:         G Jan10 Apr10 Jul10    NA
# 8:         H Jan10 Apr10    NA Oct10
# 9:         I Jan10    NA Jul10    NA
#10:         J    NA Apr10 Jul10 Oct10

【讨论】:

  • 感谢您的快速回复。有用。然而,想法是更改“x”条目而不是 NA。我相应地改变了它!
猜你喜欢
  • 2022-06-15
  • 2022-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-04-03
  • 2017-09-20
  • 1970-01-01
  • 2013-10-20
  • 2019-08-06
相关资源
最近更新 更多