应用于 data.frame 中除一列之外的所有列并替换 R 中的数据

Har*_*old 3 r lapply dataframe data.table

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

根据评论,

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

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

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

Ben*_*sen 7

我假设你使用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
Run Code Online (Sandbox Code Playgroud)

或者直接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
Run Code Online (Sandbox Code Playgroud)

如果您想保留该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
Run Code Online (Sandbox Code Playgroud)