2017-10-05 31 views
-1

在数据框“days”中,我想将名为'round.numbers'的函数应用于除名为'id'的列之外的所有列。Lapply到data.frame中的所有列除外,并替换R中的数据

根据该意见,

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

但是它创建一个新表,而不是替换原有的数据。

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

+2

看起来你正在使用'data.table',尝试'天[, - “ID”] [,lapply(X = .SD,FUN = round.numbers']' –

+0

谢谢。有用!但它似乎会生成一个新的data.table,而不是替换原点。我该如何替换它们。 (id列保持不变,其余列由函数改变)days [,-'id'] < - days [,-'id'] [,lapply(X = .SD,FUN ='round.numbers ')]这是行不通的... – Harold

+0

因为我想保留id列。 – Harold

回答

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 
+0

谢谢,但我想保留原始的id列。情况就像我已经有一个三列的表:id,重量,高度,而我只想圆重量和身高到1位,我仍然需要在我的表中ID,而不是放弃。 – Harold

+0

更改我的答案,所以你可以保留'id'的列 –