R:根据数据框的列应用函数的有效方法
R: efficient way to apply a function according to the columns of a dataframe
我现在觉得自己非常愚蠢,但我只能想出一个 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 被转换为矩阵,我失去了 factor/numeric 结构)。有什么建议吗?
注意:我不是要应用基于 列中的 值的函数,而是基于 列的 类型。
这应该有效。
df1[] <- sapply(df1, function(i) if(is.numeric(i)) scale(i) else i)
你可以试试下面这个,和评论里的建议差不多:
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
我现在觉得自己非常愚蠢,但我只能想出一个 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 被转换为矩阵,我失去了 factor/numeric 结构)。有什么建议吗?
注意:我不是要应用基于 列中的 值的函数,而是基于 列的 类型。
这应该有效。
df1[] <- sapply(df1, function(i) if(is.numeric(i)) scale(i) else i)
你可以试试下面这个,和评论里的建议差不多:
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