我想学习如何在我的数据帧的特定列上应用函数而不用#34;排除"来自我的df的其他列。例如,我希望将某些特定列乘以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,然后将旧数据框与新创建的数据框合并以获得完整的数据帧。但我认为必须有更好的解决方案。不是吗?
答案 0 :(得分:6)
如果您只想对一列或几列进行计算,可以使用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
答案 1 :(得分:0)
以下代码将所需的功能仅应用于您指定的列。 我将创建一个简单的数据框作为可重现的示例。
(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()
。
答案 2 :(得分:0)
在dplyr
中,我们将使用mutate_at
,在其中您可以选择或排除特定变量(通过在变量名前加上“-”减号)。
您可以只命名一个函数
df <- df %>%
mutate_at(vars(columnA), scale)
或创建自己的
df <- df %>%
mutate_at(vars(columnA, columnC), function(x) {do this})