【问题标题】:R: efficient way to apply a function according to the columns of a dataframeR:根据数据框的列应用函数的有效方法
【发布时间】:2016-07-15 23:03:18
【问题描述】:

我现在觉得自己非常愚蠢,但我只能想出一个 for 循环......

我有一个包含数值列和阶乘列的数据框。我只是希望数字列被缩放,而阶乘列保持原样。例如

> set.seed(160)
> df1 <- data.frame(as.data.frame(matrix(rnorm(8), ncol=2)), 
                    V3=factor(c("A", "A", "B", "B")))
> df1
          V1         V2 V3
1  0.6185496 -0.6410203  A
2 -0.8722777  2.6520986  A
3  0.8529240 -1.4156009  B
4  0.3678875 -1.1615607  B

我想买

> df1
          V1         V2 V3
1  0.4901808 -0.2642698  A
2 -1.4493527  1.4780179  A
3  0.7950968 -0.6740765  B
4  0.1640750 -0.5396717  B

使用比

更高效的命令
for(i in 1:ncol(df1)) {
  if(is.factor(df1[,i])) {df1[,i] <- df1[,i]}
  else{df1[,i] <- scale(df1[,i])}
}

我尝试了lapply(), sapply(), if(), ifelse() 的各种组合,但似乎没有任何效果(apply 不起作用,因为 df 被转换为矩阵并且我失去了因子/数字结构)。有什么建议吗?

注意:我不是尝试基于列中的 应用函数,而是基于列的 类型

【问题讨论】:

  • index &lt;- !sapply(df1,is.factor); df1[index] &lt;- scale(df1[index]),但这仍然是题外话;-)
  • Ops,我以为我在 SE 上发帖 ;) 还是谢谢!

标签: r categorical-data dataframe


【解决方案1】:

你可以试试下面的,类似cmets中的一个建议:

df1[sapply(df1, is.numeric)] <- scale(df1[sapply(df1, is.numeric)])
#> df1
#          V1         V2 V3
#1  0.4901808 -0.2642698  A
#2 -1.4493527  1.4780179  A
#3  0.7950968 -0.6740765  B
#4  0.1640750 -0.5396717  B

【讨论】:

    【解决方案2】:

    这应该可行。

    df1[] <- sapply(df1, function(i) if(is.numeric(i)) scale(i) else i)
    

    【讨论】:

      猜你喜欢
      • 2017-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-11
      • 2021-09-03
      • 2015-04-19
      • 2017-12-11
      • 2018-01-06
      相关资源
      最近更新 更多