我正在尝试按天汇总收入数据。该列同时包含资产净值和实际收入数据。收入目前是一个“字符”。面临的挑战是您不能对“字符”求和,并且不能尝试更改班级休息时间。
通过as.numeric
更改类会产生此错误:“ NAs由强制引入”
或as.numeric(as.character())
会完全擦除该列中的数据并返回所有NA。
日期列采用日期格式。这是我要执行的汇总。
df_agg<-aggregate(df$revenue,by=list(df$Date),sum,na.rm=TRUE)
当然,执行上述代码会导致:“ Summary.factor(c(1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,1L,: “总和”对因素没有意义”
最初是通过CSV读取数据的。我尝试阅读有/没有stringsAsFactors=FALSE
Example code
Code Date Visits Revenue
1A 1/1/2018 3 5
2A 1/1/2018 5 NA
3A 1/2/2018 8 7
4A 1/3/2018 6 2
5A 1/3/2018 8 5
答案 0 :(得分:1)
我怀疑问题的根源是如何将数据读入R。有多种原因导致对read
函数的特定调用最终会给您character
列数字。对于read.table
或read.csv
,如果收入列中的300000条目中没有任何内容被scan()
解释为实数,则该列将不会转换为数字。这可能是拼写错误,除了NA以外,还可以表示缺失值。如果强制read
函数通过包含一个colClasses
参数来尝试将您的列转换为数字,则会得到一条提示性错误消息。这是一个示例:
df <- read.table(text = "Code Date Visits Revenue
1A 1/1/2018 3 5
2A 1/1/2018 5 NA
3A 1/2/2018 8 7
4A 1/3/2018 6 2
5A 1/3/2018 8 5
6A 1/3/2018 7 2w", header = TRUE,
colClasses = c("character", "Date", "numeric", "numeric"),
stringsAsFactors = FALSE)
这会产生错误消息:
`扫描错误(file = file,what = what,sep = sep,quote = quote,dec = dec,: scan()预期为“真实”,得到“ 2w”``
在这里,您确切地知道问题所在。由于手指输入错误,它无法将列转换为数字。在源文件中对其进行更改,或者将其添加为以na.string
传递的字符向量。
df <- read.table(text = "Code Date Visits Revenue
1A 1/1/2018 3 5
2A 1/1/2018 5 NA
3A 1/2/2018 8 7
4A 1/3/2018 6 2
5A 1/3/2018 8 5
6A 1/3/2018 7 2w", header = TRUE,
colClasses = c("character", "Date", "numeric", "numeric"),
stringsAsFactors = FALSE,
na.string = c("NA", "2w"))
df
# Code Date Visits Revenue
# 1 1A 0001-01-20 3 5
# 2 2A 0001-01-20 5 NA
# 3 3A 0001-02-20 8 7
# 4 4A 0001-03-20 6 2
# 5 5A 0001-03-20 8 5
# 6 6A 0001-03-20 7 NA
尤其是当我有一个非常大的文件要读入时,我总是传递一个colClasses
参数。它不仅可以帮助您诊断和解决此类问题,还可以大大加快文件读取速度。
答案 1 :(得分:0)
这可能与您将数据读入R的方式有关,但是(在修正了另一个拼写错误Revenue != revenue
之后),您的代码对我有用。
df = read.table(text="Code Date Visits Revenue
1A 1/1/2018 3 5
2A 1/1/2018 5 NA
3A 1/2/2018 8 7
4A 1/3/2018 6 2
5A 1/3/2018 8 5",
header=TRUE)
df_agg <- aggregate(df$Revenue,by=list(df$Date),sum,na.rm=TRUE)
Group.1 x
1 1/1/2018 5
2 1/2/2018 7
3 1/3/2018 7