Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:将百分比数据框从系数转换为数字_R - Fatal编程技术网

R:将百分比数据框从系数转换为数字

R:将百分比数据框从系数转换为数字,r,R,将数据帧转换为R时遇到问题 我有一系列列,它们被解读为因子,并带有%符号 我知道,对于一个专栏,我可以做到: df[,3] <- as.numeric(sub("%","",df[,3])) 回答:以下是在你们帮了我这么多之后,我是如何通过一个命令做到这一点的!我在指定函数部分时遇到问题 df=read.csv("all response rates.csv") df[-1]<-data.frame(apply(df[-1], 2, function(x) as.nume

将数据帧转换为R时遇到问题

我有一系列列,它们被解读为
因子
,并带有
%
符号

我知道,对于一个专栏,我可以做到:

df[,3] <- as.numeric(sub("%","",df[,3]))
回答:以下是在你们帮了我这么多之后,我是如何通过一个命令做到这一点的!我在指定函数部分时遇到问题

df=read.csv("all response rates.csv")
df[-1]<-data.frame(apply(df[-1], 2, function(x) 
    as.numeric(sub("%","",as.character(x)))))
df=read.csv(“所有响应率.csv”)

df[-1]使用
base
中的函数尝试此方法:

# dummy data:
df<-data.frame(v1=c("78%", "65%", "32%"), v2=c("43%", "56%", "23%"))

# function
df2<-data.frame(lapply(df, function(x) as.numeric(sub("%", "", x))) )
#虚拟数据:

df
parse_number
readr
包中删除
%
符号。对于给定的数据集,请尝试:

library(dplyr)
library(readr)

res <- cbind(df %>% select(Year), # preserve the year column as-is
             df %>% select(-Year) %>% mutate_all(funs(parse_number))
             )

> res
    Year v1 v2 v3 v4
1 12-Oct  0  0 39 14
2 12-Nov  0  6 59  4
3 12-Dec 22  0 37 26
4 13-Jan 45  0 66 19
5 13-Feb 28 39 74 13

这里有一个使用
data.table
中的
set
的选项,这对于大型数据集来说会更快,因为可以避免
[.data.table
的开销

library(stringi)
library(data.table)

setDT(df)
for(j in 2:ncol(df)){
     set(df, i=NULL, j=j, value= as.numeric(stri_extract(df[[j]], regex='\\d+')))
}

df
#     Year v1 v2 v3 v4
#1: 12-Oct  0  0 39 14
#2: 12-Nov  0  6 59  4
#3: 12-Dec 22  0 37 26
#4: 13-Jan 45  0 66 19
#5: 13-Feb 28 39 74 13

这里有一个单行解决方案,它假设数据位于固定宽度的列中。我需要删除第一行名称,因为所有列都没有名称。列的宽度被指定为整数(负意义是跳过那么多字符)。在读取期间,它还将列类更改为数字

your data

1 12-Oct        0%      0%      39%      14%
2 12-Nov        0%      6%      59%       4%
3 12-Dec       22%      0%      37%      26%
4 13-Jan       45%      0%      66%      19%
5 13-Feb       28%     39%      74%      13%

the R one-line script

adf <- read.fwf(file="a.dat",widths=c(-8,9,-1,7,-1,8,-1,8),colClasses=rep("numeric",4))

output result (first col provided by R to count the rows)

  V1 V2 V3 V4
1  0  0 39 14
2  0  6 59  4
3 22  0 37 26
4 45  0 66 19
5 28 39 74 13
您的数据
10月12日0%0%39%14%
11月2日12日0%6%59%4%
12月3日22%0%37%26%
4.1月13日45%0%66%19%
2月5日13日28%39%74%13%
R单行脚本

adf如果百分号位于每个字符串的末尾,请尝试使用
comment.char=“%”再次读取它
当我这样做时,第一列数据被正确读取,但其他列都变成了LOGI,都是NA…….什么给了我?我不知道。给我们看一些数据:)会做@RichardScriven!文件的前五行如何请
lappy
更合适,因为它不会强制到矩阵-类似于
数据。frame(lappy(df,function(x)as.numeric(sub(“%”,“,”,x)))
更不用说这个答案是错误的,并且没有将因子转换为数字,试试
str(df2)
@vashts85,答案是“严格”错误的,因为最初的答案没有完全回答一个由两部分组成的问题(因为我也没有将sub包装在
as.numeric()中)
)我对答案进行了编辑,以反映这一点和@thelatemail更有用的建议。
library(dplyr)
library(readr)

res <- cbind(df %>% select(Year), # preserve the year column as-is
             df %>% select(-Year) %>% mutate_all(funs(parse_number))
             )

> res
    Year v1 v2 v3 v4
1 12-Oct  0  0 39 14
2 12-Nov  0  6 59  4
3 12-Dec 22  0 37 26
4 13-Jan 45  0 66 19
5 13-Feb 28 39 74 13
df %>% select(-Year) %>% mutate_all(funs(parse_number))
library(stringi)
library(data.table)

setDT(df)
for(j in 2:ncol(df)){
     set(df, i=NULL, j=j, value= as.numeric(stri_extract(df[[j]], regex='\\d+')))
}

df
#     Year v1 v2 v3 v4
#1: 12-Oct  0  0 39 14
#2: 12-Nov  0  6 59  4
#3: 12-Dec 22  0 37 26
#4: 13-Jan 45  0 66 19
#5: 13-Feb 28 39 74 13
your data

1 12-Oct        0%      0%      39%      14%
2 12-Nov        0%      6%      59%       4%
3 12-Dec       22%      0%      37%      26%
4 13-Jan       45%      0%      66%      19%
5 13-Feb       28%     39%      74%      13%

the R one-line script

adf <- read.fwf(file="a.dat",widths=c(-8,9,-1,7,-1,8,-1,8),colClasses=rep("numeric",4))

output result (first col provided by R to count the rows)

  V1 V2 V3 V4
1  0  0 39 14
2  0  6 59  4
3 22  0 37 26
4 45  0 66 19
5 28 39 74 13