我正在使用data
在csv
下面写到write.csv
,但是当我查看csv
文件时,文件中的数据不同于/大于我的数据当我将print()
从data
到R
控制台时获得。
有人建议为什么会这样吗?
输入数据:数据
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()在控制台中看到的不同。
答案 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
列名,由KK
和JJ
(嵌套的列名)代替。如果保留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
但是如果您在O
和P
中具有可变的列数,则它将成为手动过程。我上面提供的解决方案更具编程性和动态性。
旁注:我将在这里使用的变量重命名为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