在保留数据框其余部分的情况下,在特定列上应用函数

15
我希望学习如何在DataFrame中对特定列应用函数,而不需要“排除”其他列。例如,我想将某些特定列乘以1000,同时保留其他列不变。
使用sapply函数可以实现以上功能,例如:
    a<-as.data.frame(sapply(table.xy[,1], function(x){x*1000}))

我希望用第一列乘以1000得到新的数据框,但不包含未参与运算的其他列。所以我的尝试是这样的:

    a<-as.data.frame(sapply(table.xy, function(x) if (colnames=="columnA") {x/1000} else {x}))

但这种方法并没有奏效。

我的解决办法是给这两个数据帧都添加一行ID,并将旧的数据帧与新创建的数据帧合并,以获得完整的数据帧。但我认为一定有更好的解决办法,不是吗?

3个回答

7

如果您只想对一个或几个列进行计算,可以使用 transform 或手动索引:

# with transfrom:
df <- data.frame(A = 1:10, B = 1:10)
df <- transform(df, A = A*1000)

# Manually:
df <- data.frame(A = 1:10, B = 1:10)
df$A <- df$A * 1000

如果我有很多列(n=30),我该怎么做呢?打出所有的名称会太麻烦了... - Joschi
是的,实际上我总是像这样在数据框上进行计算:a<-as.data.frame(sapply(df[,2:42], function(x){x*1000})) 但是,我的数据框df的第一列不在新创建的数据框(a)中...所以我不得不想办法将旧数据框的第一列合并到新数据框中。这样做也可以,但我认为可能有更简单的方法... - Joschi
我尝试了最后一个选项,一切都很顺利。谢谢。 - Juano

3
以下代码将对您指定的列应用所需的函数。 我将创建一个简单的数据框作为可重现的示例。
(df <- data.frame(x = 1, y = 1:10, z=11:20))
(df <- cbind(df[1], apply(df[2:3],2, function(x){x*1000})))

基本上,使用cbind()选择您不希望函数运行的列,然后在目标列上使用apply()和所需的函数。

抱歉打扰,但还是谢谢!一直在寻找这样的东西,“cbind()”完美解决了我的问题。 - Gainz

3

dplyr 中,我们可以使用 mutate_at 函数,通过指定变量名来选择或排除某些变量(通过在变量名前加上 "-" 负号)。您可以直接提供一个函数名:

df <- df %>% mutate_at(vars(columnA), scale)

或者自己创建一个函数:

df <- df %>% mutate_at(vars(columnA, columnC), function(x) {进行操作})


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接