read.csv如何工作?如果我的数据集有不同的列怎么办?

问题描述 投票:0回答:1

我有一个数据集。当我使用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 

所以,我想知道如何解决这个问题?

我的数据集很大。因此,手动更正错误将非常耗时。

r tidyverse read.csv
1个回答
0
投票

尝试使用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
© www.soinside.com 2019 - 2024. All rights reserved.