【问题标题】:Lapply to all columns in a data.frame except one and replace the data in R应用于 data.frame 中除一列之外的所有列并替换 R 中的数据
【发布时间】:2017-10-05 21:29:52
【问题描述】:

在数据框“days”中,我想将名为“round.numbers”的函数应用于除名为“id”的列之外的所有列。

根据评论,

days[,-'id'][, lapply(X = .SD, FUN = round.numbers)] 这成功了

但是它会创建一个新表而不是替换原始数据。

days[,-'id'] <- days[,-'id'][, lapply(X = .SD, FUN = round.numbers)] 失败。

【问题讨论】:

  • 你好像在用data.table,试试days[, -"id"][, lapply(X = .SD, FUN = round.numbers']
  • 谢谢。有用!但似乎它生成了一个新的 data.table 而不是替换原点。我该如何替换它们。 (id 列保持不变,其余列由函数更改) days[, -'id']
  • 因为我想保留id列。
  • 我假设我们保留所有行。在这种情况下,您可能只使用 by 语句,但如果这太 hacky 则可能:newDays <- days[, -"id"][, lapply(.SD, round.numbers][, id := days[, id]]
  • DT[, id := NULL]; DT[, names(DT) := lapply(.SD, f)] ? := 符号用于替换 data.table 中的列。还有一个实用函数?set,如果你有很多列,很有用..这里的例子:stackoverflow.com/questions/16846380/…

标签: r dataframe data.table lapply


【解决方案1】:

我假设你使用data.table。然后您可以使用setdiff,如下例所示:

> days = data.table(a = 1:2, b = 3:4, id = c(1, 1))
> 
> days <- days[, lapply(X = .SD, FUN = identity), 
+              .SDcols = setdiff(colnames(days), "id")]
> days
   a b
1: 1 3
2: 2 4

或者直接删除id 开始

> days = data.table(a = 1:2, b = 3:4, id = c(1, 1))
> days <- days[, id := NULL][, lapply(X = .SD, FUN = identity)]
> days
   a b
1: 1 3
2: 2 4

如果您想保留id 列,那么应该这样做(我在看到您的评论后添加了这个)

> set.seed(23812349)
> days = data.table(a = rnorm(2), b = rnorm(2), id = c(1, 1))
> days
           a         b id
1: -1.461587 0.2130853  1
2:  1.062314 0.8523587  1
> 
> .cols <- setdiff(colnames(days), "id")
> days[, (.cols) := lapply(.SD, round, digits = 1), .SDcols = .cols]
> days
      a   b id
1: -1.5 0.2  1
2:  1.1 0.9  1

【讨论】:

  • 谢谢。但我想保留原来的 id 列。情况就像我已经有一个三列的表:id、重量、高度。我只想将体重和身高四舍五入到 1 位数。而且我的表中仍然需要 id,而不是丢弃它。
  • 更改了我的答案,以便您可以保留id
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-03
  • 2020-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多