我有一个数据集。当我使用read.csv导入数据时,我收到警告说一些观察结果应该有4列,但实际上少于4列。
[当我检查数据时,我发现一些观察结果被分成两行,如下所示:(#3观察值]
Number, name, value_1, value_2
1, 'A', 2, 3
2, 'B', 4, 5
3, 'C', 7
8
4, 'D', 9, 10
5, 'E', 11, 12
所以,我想知道如何解决这个问题?
我的数据集很大。因此,手动更正错误将非常耗时。
尝试使用read.csv函数的fill参数为NA填充不完整的行以获取缺失的值。这里的read.table函数演示了fill参数:
df <- read.table(text="Number, name, value_1, value_2
1, 'A', 2, 3
2, 'B', 4, 5
3, 'C', 7
8
4, 'D', 9, 10
5, 'E', 11, 12",
sep = ",", fill = T, header = T, stringsAsFactors = F)
df
# Number name value_1 value_2
# 1 1 A 2 3
# 2 2 B 4 5
# 3 3 C 7 NA
# 4 8 NA NA
# 5 4 D 9 10
# 6 5 E 11 12
请注意,这里的第四个记录“名称”值未作为NA而是作为空字符串导入。
您可以将相同的填充参数传递给read.csv:
df <- read.csv("myfile.csv", header = T, sep = ",", fill = T, stringsAsFactors = F)
如果您仍然无法使用fill参数使用read.csv函数导入文件,那么我建议使用带有sep =“ \ n”(换行符)的read.table逐行导入数据,然后清理并从R中生成的字符串中解析数据,而不是手动编辑文件。清除的方式在很大程度上取决于文件中的异常情况,但是对于提供的示例数据来说,类似的方法适用,但是假设行中所有丢失的值都类似地在可用数据的右边丢失:
require(stringr)
lines <- read.table(text="Number, name, value_1, value_2\n
1, 'A', 2, 3\n
2, 'B', 4, 5\n
3, 'C', 7\n
8\n
4, 'D', 9, 10\n
5, 'E', 11, 12\n",
sep = "\n", fill = T, header = T, stringsAsFactors = F)
record_list <- apply(lines, 1, FUN= function(x){str_squish(str_split(x, ",", simplify = T))})
# Assuming all missing values are to the right of present values on a line
na_filled <- sapply(record_list, FUN = function(x){x <- c(x, rep.int(as.character(NA), 4 - length(x)))})
df <- data.frame(t(na_filled), stringsAsFactors = F)
names(df) <- c("Number", "name", "value_1", "value_2")
df
# Number name value_1 value_2
# 1 1 A 2 3
# 2 2 B 4 5
# 3 3 C 7 <NA>
# 4 8 <NA> <NA> <NA>
# 5 4 D 9 10
# 6 5 E 11 12