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
如何对数据框的每隔一列应用一个函数?也就是说,如何修改 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