如何在数据框的每个第二列上应用函数?也就是说,如何修改df2 <- sapply(df1, fun)
使得df2等于df1但是应用于每一个第二列的乐趣?这是我试过的:
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
此代码存在的问题是,它会删除未应用有趣的所有列(dim(df2) # 5 1
)。
答案 0 :(得分:3)
您可以为对象的子集指定新值。说:
x <- c(1,2,3)
x[2] <- 4
现在x将是c(1,4,2)
。类似地,您可以对矩阵或数据帧的行/列执行此操作。这里我们使用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)
由于平方操作是&#34;矢量化&#34;在R中,在这种情况下你也可以这样做:
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