【问题标题】:R, apply function on every second column of a data frame?R,对数据框的每隔一列应用函数?
【发布时间】:2017-01-27 00:57:44
【问题描述】:

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

【问题讨论】:

  • mtcars[c(FALSE, TRUE)] &lt;- lapply(mtcars[c(FALSE, TRUE)], as.character)
  • 很遗憾,我没有收到您的评论。
  • @Joe - 它只是每隔一列替换一次,因为 c(FALSE,TRUE)FALSE/TRUE/FALSE/TRUE/FALSE... 一样被回收,遍历您的数据列。
  • @rawr 的答案仅替换指定的列,这意味着您不能立即将 lapply 调用的输出分配给新对象。请改用df1[c(TRUE, FALSE)] &lt;- sapply(df1[c(TRUE, FALSE)], function(x) x^2)
  • 学习永无止境。

标签: r sapply


【解决方案1】:

将变量分配给切片

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

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)

向量化函数

由于平方运算在 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

【讨论】:

  • 请注意,OP 每秒请求一次 column,而不是每秒一次请求 row。不过,感谢您为解释所做的努力。
  • 已修复。如果对按行进行子集感兴趣,请参阅早期版本的答案。
猜你喜欢
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2020-02-12
  • 2015-04-19
  • 1970-01-01
  • 2018-10-29
相关资源
最近更新 更多