将逗号分隔的小数从字符转换为数字
Convert comma separated decimals from character to numeric
为了我的考试,我必须在 r 中构建一些散点图。我创建了一个包含 4 个变量的数据框。有了这个数据框,我想在我的散点图中添加回归线。
我的数据框的名称是 "alle"。
变量名称是:demo、tot、besch、usd
使用此代码,我尝试对齐回归线,但得到以下结果:
reg1<- lm(tot~demo, data=alle)
Warning messages:
1: In model.response(mf, "numeric") :
using type = "numeric" with a factor response will be ignored
2: In Ops.factor(y, z$residuals) : ‘-’ not meaningful for factors
这里是"alle"
的结构
str(alle)
'data.frame': 11 obs. of 4 variables:
$ demo : chr "498.300.775" "500.297.033" "502.090.235" "503.170.618" ...
$ tot : Factor w/ 11 levels "4.846.423","4.871.049",..: 1 3 4 5 2 8 7 6 10 9 ...
$ besch: Factor w/ 9 levels "68,4","68,6",..: 5 7 3 2 2 1 1 4 6 8 ...
$ usd : Factor w/ 44 levels "0,68434","0,72584",..: 26 30 29 23 28 22 24 25 15 14 ...
尝试使用
将列 "demo" 转换为数字
alle$demo <- as.numeric(as.character(alle$demo))
它将列转换为数字,但现在行已满 "NA"s。
我认为我所有的列都必须是数字。
如何将所有 4 列转换为数字并最终绘制回归线。
数据:
> head(alle,6)
demo tot besch usd
1 498.300.775 4.846.423 69,8 1,3705
2 500.297.033 4.891.934 70,3 1,4708
3 502.090.235 4.901.358 69,0 1,3948
4 503.170.618 4.906.313 68,6 1,3257
5 502.964.837 4.871.049 68,6 1,3920
6 504.047.964 5.010.371 68,4 1,2848
谢谢
尝试分两步完成。先去掉点号,再把逗号换成小数点,强制转成数字。
alle[] <- lapply(alle, function(x) gsub("\.", "", x))
alle[] <- lapply(alle, function(x) as.numeric(sub(",", ".", x)))
注:
为了便于阅读,上述解决方案分为两部分。下面的代码做同样的事情,但它只需要一个 lapply
循环,因此如果数据集很大,应该会更快。如果数据集是中小型,也许两步解决方案更可取。
alle[] <- lapply(alle, function(x){
as.numeric(sub(",", ".", gsub("\.", "", x)))
})
与dplyr
:
library(dplyr)
alle %>%
mutate_all(as.character) %>%
mutate_at(c("besch","usd"),function(x) as.numeric(as.character(gsub(",",".",x)))) ->alle
demo tot besch usd
1 498.300.775 4.846.423 69.8 1.3705
2 500.297.033 4.891.934 70.3 1.4708
3 502.090.235 4.901.358 69.0 1.3948
4 503.170.618 4.906.313 68.6 1.3257
5 502.964.837 4.871.049 68.6 1.3920
6 504.047.964 5.010.371 68.4 1.2848
为了我的考试,我必须在 r 中构建一些散点图。我创建了一个包含 4 个变量的数据框。有了这个数据框,我想在我的散点图中添加回归线。
我的数据框的名称是 "alle"。 变量名称是:demo、tot、besch、usd
使用此代码,我尝试对齐回归线,但得到以下结果:
reg1<- lm(tot~demo, data=alle)
Warning messages:
1: In model.response(mf, "numeric") :
using type = "numeric" with a factor response will be ignored
2: In Ops.factor(y, z$residuals) : ‘-’ not meaningful for factors
这里是"alle"
的结构str(alle)
'data.frame': 11 obs. of 4 variables:
$ demo : chr "498.300.775" "500.297.033" "502.090.235" "503.170.618" ...
$ tot : Factor w/ 11 levels "4.846.423","4.871.049",..: 1 3 4 5 2 8 7 6 10 9 ...
$ besch: Factor w/ 9 levels "68,4","68,6",..: 5 7 3 2 2 1 1 4 6 8 ...
$ usd : Factor w/ 44 levels "0,68434","0,72584",..: 26 30 29 23 28 22 24 25 15 14 ...
尝试使用
将列 "demo" 转换为数字alle$demo <- as.numeric(as.character(alle$demo))
它将列转换为数字,但现在行已满 "NA"s。
我认为我所有的列都必须是数字。 如何将所有 4 列转换为数字并最终绘制回归线。
数据:
> head(alle,6)
demo tot besch usd
1 498.300.775 4.846.423 69,8 1,3705
2 500.297.033 4.891.934 70,3 1,4708
3 502.090.235 4.901.358 69,0 1,3948
4 503.170.618 4.906.313 68,6 1,3257
5 502.964.837 4.871.049 68,6 1,3920
6 504.047.964 5.010.371 68,4 1,2848
谢谢
尝试分两步完成。先去掉点号,再把逗号换成小数点,强制转成数字。
alle[] <- lapply(alle, function(x) gsub("\.", "", x))
alle[] <- lapply(alle, function(x) as.numeric(sub(",", ".", x)))
注:
为了便于阅读,上述解决方案分为两部分。下面的代码做同样的事情,但它只需要一个 lapply
循环,因此如果数据集很大,应该会更快。如果数据集是中小型,也许两步解决方案更可取。
alle[] <- lapply(alle, function(x){
as.numeric(sub(",", ".", gsub("\.", "", x)))
})
与dplyr
:
library(dplyr)
alle %>%
mutate_all(as.character) %>%
mutate_at(c("besch","usd"),function(x) as.numeric(as.character(gsub(",",".",x)))) ->alle
demo tot besch usd
1 498.300.775 4.846.423 69.8 1.3705
2 500.297.033 4.891.934 70.3 1.4708
3 502.090.235 4.901.358 69.0 1.3948
4 503.170.618 4.906.313 68.6 1.3257
5 502.964.837 4.871.049 68.6 1.3920
6 504.047.964 5.010.371 68.4 1.2848