7

我正在尝试将 R 中的数据框写入文本文件,但是它返回以下错误:

Error in if (inherits(X[[j]], "data.frame") && ncol(xj) > 1L)
             X[[j]] <- as.matrix(X[[j]]) : 
  missing value where TRUE/FALSE needed

我使用以下命令进行导出:

write.table(df, file ='dfname.txt', sep='\t' )

我不知道问题可能源于什么。至于“需要 TRUE/FALSE 的缺失数据”,我只有一列包含 TRUE/FALSE 值,并且这些值都没有丢失。

数据框的内容:

> str(df)
'data.frame':   776 obs. of  15 variables:
 $ Age         : Factor w/ 4 levels "","A","J","SA": 2 2 2 2 2 2 2 2 2 2 ...
 $ Sex         : Factor w/ 2 levels "F","M": 1 1 1 1 2 2 2 2 2 2 ...
 $ Rep         : Factor w/ 11 levels "L","NR","NRF",..: 1 1 4 4 2 2 2 2 2 2 ...
 $ FA          : num  61.5 62.5 60.5 61 59.5 59.5 59.1 59.2 59.8 59.9 ...
 $ Mass        : num  20 19 16.5 17.5 NA 14 NA 23 19 18.5 ...
 $ Vir1        : num  999 999 999 999 999 999 999 999 999 999 ...
 $ Vir2        : num  999 999 999 999 999 999 999 999 999 999 ...
 $ Vir3        : num  40 999 999 999 999 999 999 999 999 999 ...
 $ Location    : Factor w/ 4 levels "Loc1",..: 4 4 4 4 4 4 2 2 2 2 ...
 $ Site        : Factor w/ 6 levels "A","B","C",..: 5 5 5 5 5 5 3 3 3 3 ...
 $ Date        : Date, format: "2010-08-30" "2010-08-30" ...
 $ Record      : int  35 34 39 49 69 38 145 112 125 140 ...
 $ SampleID    : Factor w/ 776 levels "AT1-A-F1","AT1-A-F10",..: 525 524 527 528
                                                                 529 526 111 78
                                                                 88 110 ...
 $ Vir1Inc     : logi  FALSE FALSE FALSE FALSE FALSE FALSE ...
 $ Month       :'data.frame':   776 obs. of  2 variables:
  ..$ Dates: Date, format: "2010-08-30" "2010-08-30" ...
  ..$ Month: Factor w/ 19 levels "Apr-2011","Aug-2010",..: 2 2 2 2 
                                                           2 2 18 18 18 18 ...

我希望我已经提供了足够/正确的信息...

非常感谢,希瑟

4

3 回答 3

6

重现错误的示例。我创建了一个嵌套的 data.frame:

Month=data.frame(Dates= as.Date("2003-02-01") + 1:15,
                 Month=gl(12,2,15))
dd <- data.frame(Age=1:15)
dd$Month <- Month
str(dd)
'data.frame':   15 obs. of  2 variables:
 $ Age  : int  1 2 3 4 5 6 7 8 9 10 ...
 $ Month:'data.frame':  15 obs. of  2 variables:
  ..$ Dates: Date, format: "2003-02-02" "2003-02-03" "2003-02-04" ...
  ..$ Month: Factor w/ 12 levels "1","2","3","4",..: 1 1 2 2 3 3 4 4 5 5 ...

不,我尝试保存它,我重现了错误:

write.table(dd)
Error in if (inherits(X[[j]], "data.frame") && ncol(xj) > 1L) 
    X[[j]] <- as.matrix(X[[j]]) :  missing value where TRUE/FALSE needed

无需调查,一种删除嵌套的选项data.frame

write.table(data.frame(subset(dd,select=-c(Month)),unclass(dd$Month)))
于 2013-06-25T12:06:24.650 回答
5

agstudy 的解决方案提供了一个很好的快速解决方案,但是有一个 简单的替代/通用解决方案,您不必在 data.frame 中指定嵌套的元素:

以下位只是从agstudy 的解决方案中复制来获取嵌套的 data.frame dd

Month=data.frame(Dates= as.Date("2003-02-01") + 1:15,
                 Month=gl(12,2,15))
dd <- data.frame(Age=1:15)
dd$Month <- Month

您可以使用akhilsbehl 的 LinearizeNestedList()函数(mrdwab 在此处提供)来展平(或线性化)嵌套级别:

library(devtools)
source_gist(4205477) #loads the function

ddf <- LinearizeNestedList(dd, LinearizeDataFrames = TRUE) 
# ddf is now a list with two elements (Age and Month)

ddf <- LinearizeNestedList(ddf, LinearizeDataFrames = TRUE) 
# ddf is now a list with 3 elements (Age, `Month/Dates` and `Month/Month`)

ddf <- as.data.frame.list(ddf)
# transforms the flattened/linearized list into a data.frame

ddf现在是一个没有嵌套的data.frame。但是,它的列名仍然反映了嵌套结构:

names(ddf)
[1] "Age"         "Month.Dates" "Month.Month"

Month.如果您想更改它(例如,在这种情况下,之前编写似乎是多余的Dates),您可以使用我从 Sacha Epskamp 复制的gsub一些正则表达式.来删除.

names(ddf) <- gsub(".*\\.","",names(ddf))  
names(ddf)
[1] "Age"   "Dates" "Month"

现在唯一剩下的就是像往常一样导出data.frame:

write.table(ddf, file="test.txt")
于 2015-05-27T22:18:17.527 回答
2

或者,您可以使用 jsonlite 包中的“扁平化”功能在导出前扁平化数据框。它实现了与提到的其他功能相同的结果,并且更容易实现。

jsonlite::flatten

https://rdrr.io/cran/jsonlite/man/flatten.html

于 2016-09-13T02:35:23.430 回答