在R中将不正确的数据写入CSV

时间:2019-02-27 06:11:00

标签: r csv dataframe data.table

我正在使用datacsv下面写到write.csv,但是当我查看csv文件时,文件中的数据不同于/大于我的数据当我将print()dataR控制台时获得。

有人建议为什么会这样吗?

输入数据:数据

data <- structure(
  list(
    `A` = c(
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_
    ),
    `B` = c("-0.5", "-0.5", "-0.5", "-0.5", "-0.5"),
    `T` = c(
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_
    ),
    `C` = c(
      "4.5999999999999996",
      "4.5999999999999996",
      "4.5999999999999996",
      "4.5999999999999996",
      "2.4"
    ),
    `R` = c("V",
            "V", "V", "V", "V"),
    `D` = c(
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_
    ),
    `S` = c(
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_
    ),
    `E` = c(
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_,
      NA_character_
    ),
    `F` = c("Yes",
            "Yes", "Yes", "Yes", "Yes"),
    `G` = c("AA",
            "BB", "CC", "DD",
            "EE"),
    `H` = c(NA_real_, NA_real_, NA_real_,
            NA_real_, NA_real_),
    `I` = c(NA_real_, NA_real_, NA_real_,
            NA_real_, NA_real_),
    `J` = c(NA_real_, NA_real_, NA_real_,
            NA_real_, NA_real_),
    `K` = structure(
      c(
        NA_character_,
        NA_character_,
        NA_character_,
        NA_character_,
        NA_character_
      ),
      .Dim = c(5L, 1L)
    ),
    `L` = structure(
      c(
        NA_character_,
        NA_character_,
        NA_character_,
        NA_character_,
        NA_character_
      ),
      .Dim = c(5L, 1L)
    ),
    `M` = c(NA_real_, NA_real_,
            NA_real_, NA_real_, NA_real_),
    `N` = structure(
      c(
        NA_character_,
        NA_character_,
        NA_character_,
        NA_character_,
        NA_character_
      ),
      .Dim = c(5L, 1L)
    ),
    `O` = structure(list(
      KK = c(NA_real_,
             NA_real_, NA_real_, NA_real_, NA_real_)
    ), row.names = c(NA,
                     5L), class = "data.frame"),
    `P` = structure(list(
      JJ = c(NA_real_,
              NA_real_, NA_real_, NA_real_, NA_real_)
    ), row.names = c(NA,
                     5L), class = "data.frame")
  ),
  row.names = c(NA, 5L),
  class = "data.frame"
)

write.csv()根据上述数据

write.csv(data, file = "data.csv", row.names = FALSE)

上述代码的输出不正确

A   B   T   C   R   D   S   E   F   G   H   I   J   K   L   M   N   O   P                               
NA  -0.5    NA  4.6 V   NA  NA  NA  Yes AA  NA  NA  NA  NA  NA  NA  NA  c(NA     NA  NA  NA  NA)    c(NA     NA  NA  NA  NA)
NA  -0.5    NA  4.6 V   NA  NA  NA  Yes BB  NA  NA  NA  NA  NA  NA  NA  c(NA     NA  NA  NA  NA)    c(NA     NA  NA  NA  NA)
NA  -0.5    NA  4.6 V   NA  NA  NA  Yes CC  NA  NA  NA  NA  NA  NA  NA  c(NA     NA  NA  NA  NA)    c(NA     NA  NA  NA  NA)
NA  -0.5    NA  4.6 V   NA  NA  NA  Yes DD  NA  NA  NA  NA  NA  NA  NA  c(NA     NA  NA  NA  NA)    c(NA     NA  NA  NA  NA)
NA  -0.5    NA  2.4 V   NA  NA  NA  Yes EE  NA  NA  NA  NA  NA  NA  NA  c(NA     NA  NA  NA  NA)    c(NA     NA  NA  NA  NA)

所需的print()输出

> print(data)
     A    B    T                  C R    D    S    E   F  G  H  I  J    K    L  M    N KK JJ
1 <NA> -0.5 <NA> 4.5999999999999996 V <NA> <NA> <NA> Yes AA NA NA NA <NA> <NA> NA <NA> NA NA
2 <NA> -0.5 <NA> 4.5999999999999996 V <NA> <NA> <NA> Yes BB NA NA NA <NA> <NA> NA <NA> NA NA
3 <NA> -0.5 <NA> 4.5999999999999996 V <NA> <NA> <NA> Yes CC NA NA NA <NA> <NA> NA <NA> NA NA
4 <NA> -0.5 <NA> 4.5999999999999996 V <NA> <NA> <NA> Yes DD NA NA NA <NA> <NA> NA <NA> NA NA
5 <NA> -0.5 <NA>                2.4 V <NA> <NA> <NA> Yes EE NA NA NA <NA> <NA> NA <NA> NA NA

我不关心数值,而是更多地关注为什么最后几列与使用print()在控制台中看到的不同。

1 个答案:

答案 0 :(得分:1)

您的数据是嵌套的。在这种情况下,立即采取的补救措施是微不足道的,而且很明显,但是如果您的数据在现实中不能完美配合,那么这个答案可能就不够。

这是有原因的:最后两列中嵌入了框架:

str(dat)
# 'data.frame': 5 obs. of  19 variables:
#  $ A: chr  NA NA NA NA ...
#  $ B: chr  "-0.5" "-0.5" "-0.5" "-0.5" ...
#  $ T: chr  NA NA NA NA ...
#  $ C: chr  "4.5999999999999996" "4.5999999999999996" "4.5999999999999996" "4.5999999999999996" ...
#  $ R: chr  "V" "V" "V" "V" ...
#  $ D: chr  NA NA NA NA ...
#  $ S: chr  NA NA NA NA ...
#  $ E: chr  NA NA NA NA ...
#  $ F: chr  "Yes" "Yes" "Yes" "Yes" ...
#  $ G: chr  "AA" "BB" "CC" "DD" ...
#  $ H: num  NA NA NA NA NA
#  $ I: num  NA NA NA NA NA
#  $ J: num  NA NA NA NA NA
#  $ K: chr [1:5, 1] NA NA NA NA ...
#  $ L: chr [1:5, 1] NA NA NA NA ...
#  $ M: num  NA NA NA NA NA
#  $ N: chr [1:5, 1] NA NA NA NA ...
#  $ O:'data.frame':    5 obs. of  1 variable:       <-----
#   ..$ KK: num  NA NA NA NA NA
#  $ P:'data.frame':    5 obs. of  1 variable:       <-----
#   ..$ JJ: num  NA NA NA NA NA

让我们验证我们的“简单”修复程序是否足够安全:

islst <- sapply(dat, is.list)
# ASSERT: number of rows and embedded lists/frames are the same length
all(nrow(dat) == sapply(dat[islst], lengths))
# [1] TRUE

这很重要,因为以下操作将失败(更好)或在功能上成功,但在逻辑上不警告就破坏数据(不好!)。

dat <- do.call("cbind.data.frame", c(dat[!islst], dat[islst], stringsAsFactors = FALSE))
str(dat)
# 'data.frame': 5 obs. of  19 variables:
#  $ A : chr  NA NA NA NA ...
#  $ B : chr  "-0.5" "-0.5" "-0.5" "-0.5" ...
#  $ T : chr  NA NA NA NA ...
#  $ C : chr  "4.5999999999999996" "4.5999999999999996" "4.5999999999999996" "4.5999999999999996" ...
#  $ R : chr  "V" "V" "V" "V" ...
#  $ D : chr  NA NA NA NA ...
#  $ S : chr  NA NA NA NA ...
#  $ E : chr  NA NA NA NA ...
#  $ F : chr  "Yes" "Yes" "Yes" "Yes" ...
#  $ G : chr  "AA" "BB" "CC" "DD" ...
#  $ H : num  NA NA NA NA NA
#  $ I : num  NA NA NA NA NA
#  $ J : num  NA NA NA NA NA
#  $ K : chr  NA NA NA NA ...
#  $ L : chr  NA NA NA NA ...
#  $ M : num  NA NA NA NA NA
#  $ N : chr  NA NA NA NA ...
#  $ KK: num  NA NA NA NA NA
#  $ JJ: num  NA NA NA NA NA

您可以在此处使用write.csv并编写正确的CSV文件。

请注意,您在这里丢失了P列名,由KKJJ(嵌套的列名)代替。如果保留P的名称很重要,请改为这样做(使用未经修改的原始dat):

dat[islst] <- Map(function(x, onm, inm) `names<-`(x, paste(onm, inm, sep = ".")),
                  dat[islst], names(dat[islst]), sapply(dat[islst], names))
dat <- do.call("cbind.data.frame", c(dat[!islst], dat[islst], stringsAsFactors = FALSE))
str(dat)
# 'data.frame': 5 obs. of  19 variables:
#  $ A   : chr  NA NA NA NA ...
#  $ B   : chr  "-0.5" "-0.5" "-0.5" "-0.5" ...
#  $ T   : chr  NA NA NA NA ...
#  $ C   : chr  "4.5999999999999996" "4.5999999999999996" "4.5999999999999996" "4.5999999999999996" ...
#  $ R   : chr  "V" "V" "V" "V" ...
#  $ D   : chr  NA NA NA NA ...
#  $ S   : chr  NA NA NA NA ...
#  $ E   : chr  NA NA NA NA ...
#  $ F   : chr  "Yes" "Yes" "Yes" "Yes" ...
#  $ G   : chr  "AA" "BB" "CC" "DD" ...
#  $ H   : num  NA NA NA NA NA
#  $ I   : num  NA NA NA NA NA
#  $ J   : num  NA NA NA NA NA
#  $ K   : chr  NA NA NA NA ...
#  $ L   : chr  NA NA NA NA ...
#  $ M   : num  NA NA NA NA NA
#  $ N   : chr  NA NA NA NA ...
#  $ O.KK: num  NA NA NA NA NA
#  $ P.JJ: num  NA NA NA NA NA

顺便说一句:当然,这里还有其他一些可以通过代码高尔夫赢的选择:

dat$P <- dat$P$JJ
dat$O <- dat$O$KK

但是如果您在OP中具有可变的列数,则它将成为手动过程。我上面提供的解决方案更具编程性和动态性。


旁注:我将在这里使用的变量重命名为dat,因为data(以及许多其他变量名称)是基本R函数的名称;当这样命名变量时,即当您忘记加载所有变量并期望它们能正常工作时,故障排除就变得很复杂(尤其是如果您不知道“封闭”是什么)。例如,您更清楚哪个错误?

# oops, I did not load my 'data' frame
summary(data)
# Error in object[[i]] : object of type 'closure' is not subsettable

# oops, I did not load my 'x' frame
summary(x)
# Error in summary(x) : object 'x' not found