1

我理解 R 中重复事物的答案通常是“ apply()”而不是循环。对于我经常创建的一些讨厌的代码,是否有更好的 R 设计模式?

因此,从 HTML 中提取表格数据,我通常需要更改数据类型,并最终运行类似这样的操作,以将第一列转换为日期格式(从十进制),并将第 2-4 列从带有逗号千位分隔符的字符串转换比如“2,400,000”到数字“2400000”。

X[,1] <- decYY2YY(as.numeric(X[,1]))
X[,2] <- as.numeric(gsub(",", "", X[,2]))
X[,3] <- as.numeric(gsub(",", "", X[,3]))
X[,4] <- as.numeric(gsub(",", "", X[,4]))

我不喜欢我在这里的左侧和骑行侧都重复了 X[,number],或者我对 2-4 重复了基本相同的语句。

是否有一种非常 R 风格的方法可以减少 X[,2] 的重复性但仍然无循环?某种说法是“将其应用于第 2、3、4 列——将当前列重新分配给修改后的版本的函数?”

我不想创建一个完整的、可重复的清理函数,真的,只是一个快速的匿名函数,它可以减少重复。

4

2 回答 2

5

假设 X 是一个数据框,我会这样做:

X[2:4] <- lapply(X[2:4], function (x) as.numeric(gsub(",", "", x)))
于 2012-04-03T20:15:17.560 回答
2

就像是

comma2numeric <- function(x) { as.numeric(gsub(",","",x)) }
X[,2:4] <- apply(X[,2:4],2,comma2numeric)

是一个开始。 transform是一个很好的就地修改习语,但它使用名称而不是列号进行操作。

编辑:第 1 行缺少右括号

于 2012-04-03T19:45:15.047 回答