R,在数据框的每隔一列上应用函数?

R, apply function on every second column of a data frame?

如何对数据框的每隔一列应用一个函数?也就是说,如何修改 df2 <- sapply(df1, fun) 使得 df2 等于 df1 但 fun 应用于每一列?这是我尝试过的:

a <- c(1,2,3,4,5)
b <- c(6,7,8,9,10)
df1 <- data.frame(a,b)
df2 <- sapply(df1[c(TRUE, FALSE)], function(x) x^2)
isTRUE(dim(df1)==dim(df2)) # FALSE

此代码的问题在于,它删除了所有未应用 fun 的列 (dim(df2) # 5 1)。

将变量分配给切片

您可以为对象的子集分配新值。说:

x <- c(1,2,3)
x[2] <- 4

现在 x 将是 c(1,4,2)。同样,您可以对矩阵或数据框的 row/columns 执行此操作。这里我们使用 apply 函数,第二个参数 2 表示 cols(1 表示 cols)。我建议使用 seq 函数生成索引序列 from=1, by=2 给出奇数,from=2, by=2 给出偶数索引。以这种方式指定它可以推广到其他子集,并且可以直接检查您是否做对了。

a <- c(1,2,3,4,5)
b <- c(6,7,8,9,10)
df1 <- data.frame(a,b)
df2 <- df1
df2[,seq(1, ncol(df2), 2)] <- apply(df2[,seq(1, ncol(df2), 2)], 2, function(x) x^2)

循环

请注意,您也可以使用循环执行此操作:

df2 <- df1
for(col in seq(1, ncol(df2), 2)) df2[,col] <- sapply(df2[,col], function(x) x^2)

矢量化函数

因为平方运算在 R 中是 "vectorised",在这种情况下你也可以这样做:

for(col in seq(1, ncol(df2), 2)) df2[,col] <- df2[,col]x^2

或者完全使用矢量化:

df2 <- df1
df2[,seq(1, ncol(df2), 2)] <- df2[,seq(1, ncol(df2), 2)]^2