我导入了一个Excel文件并得到了一个像这样的数据框
structure(list(A = structure(1:3, .Label = c("1.100", "2.300",
"5.400"), class = "factor"), B = structure(c(3L, 2L, 1L), .Label = c("1.000.000",
"500", "7.800"), class = "factor"), C = structure(1:3, .Label = c("200",
"3.100", "4.500"), class = "factor")), .Names = c("A", "B", "C"
), row.names = c(NA, -3L), class = "data.frame")
我现在想将这些chars
转换为numeric
甚至integer
。但是,点字符(.
)不是小数点,而是“千位分隔符”(它是德语)。
如何正确转换数据框?
我试过了:
df2 <- as.data.frame(apply(df1, 2, gsub, pattern = "([0-9])\\.([0-9])", replacement= "\\1\\2"))
df3 <- as.data.frame(data.matrix(df2))
但是,apply
似乎将每列转换为一系列因素。我可以阻止apply
这样做吗?
答案 0 :(得分:7)
您可以使用:
sapply(df, function(v) {as.numeric(gsub("\\.","", as.character(v)))})
给出了:
A B C
[1,] 1100 7800 200
[2,] 2300 500 3100
[3,] 5400 1000000 4500
这将为您提供matrix
对象,但如果您愿意,可以将其包装到data.frame()
。
请注意,原始数据中的列不是字符,而是因素。
修改:或者,您可以执行此操作直接将结果作为data.frame()
包装,而不是用data.frame
包装它:
# the as.character(.) is just in case it's loaded as a factor
df[] <- lapply(df, function(x) as.numeric(gsub("\\.", "", as.character(x))))
答案 1 :(得分:2)
我想我刚刚找到另一个解决方案:
必须使用stringsAsFactors = FALSE
。
像这样:
df2 <- as.data.frame(apply(df1, 2, gsub, pattern = "([0-9])\\.([0-9])", replacement= "\\1\\2"), stringsAsFactors = FALSE)
df3 <- as.data.frame(data.matrix(df2))