R,在数据帧的每第二列应用函数?

时间:2017-01-27 00:57:45

标签: r sapply

如何在数据框的每个第二列上应用函数?也就是说,如何修改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)。

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