如何确定字符向量是否是有效的数字或整数向量

And*_*arr 17 r lapply rbind

我试图将嵌套列表结构转换为数据帧.该列表看起来类似于以下内容(它是使用httr包读取的解析JSON中的序列化数据).

  myList <- list(object1 = list(w=1, x=list(y=0.1, z="cat")), object2 = list(w=NULL, x=list(z="dog")))
Run Code Online (Sandbox Code Playgroud)

编辑:我原来的示例数据太简单了.实际数据是不规则的,这意味着并非每个对象都存在所有变量,并且一些列表元素为NULL.我编辑了数据以反映这一点.

unlist(myList)在递归展平列表方面做得非常好,然后我可以用它lapply来很好地展平所有对象.

  flatList <- lapply(myList, FUN= function(object) {return(as.data.frame(rbind(unlist(object))))}) 
Run Code Online (Sandbox Code Playgroud)

最后,我可以使用它来关闭它 plyr::rbind.fill

  myDF <- do.call(plyr::rbind.fill, flatList)
  str(myDF)

  #'data.frame':    2 obs. of  3 variables:
  #$ w  : Factor w/ 2 levels "1","2": 1 2
  #$ x.y: Factor w/ 2 levels "0.1","0.2": 1 2
  #$ x.z: Factor w/ 2 levels "cat","dog": 1 2
Run Code Online (Sandbox Code Playgroud)

问题是w和xy现在被解释为字符向量,默认情况下会将其解析为数据帧中的因子.我认为这unlist()是罪魁祸首,但我无法想出另一种递归展平列表结构的方法.解决方法是对数据帧进行后处理,然后分配数据类型.确定向量是有效数值向量还是整数向量的最佳方法是什么?

jos*_*ber 14

作为讨论在这里,如果检查as.numeric返回NA值是一个简单的方法来检查,如果字符串包含数字数据.现在你可以这样做:

myDF2 <- lapply(myDF, function(col) {
  if (suppressWarnings(all(!is.na(as.numeric(as.character(col)))))) {
    as.numeric(as.character(col))
  } else {
    col
  }
})
str(myDF2)
# List of 3
#  $ w  : num [1:2] 1 2
#  $ x.y: num [1:2] 0.1 0.2
#  $ x.z: Factor w/ 2 levels "cat","dog": 1 2
Run Code Online (Sandbox Code Playgroud)

  • 通过编写 suppressWarnings(any(is.na(as.numeric(as.character(col)))))) 使长逻辑表达式变得更简单 (3认同)

Ste*_*vey 7

当包含 NA 时,@josliber 的函数将不起作用(尽管它很好地回答了示例数据的问题)。@Amy M 的功能应该可以工作,但需要加载Hmisc包。

这样的事情怎么样:

can.be.numeric <- function(x) {
    stopifnot(is.atomic(x) || is.list(x)) # check if x is a vector
    numNAs <- sum(is.na(x))
    numNAs_new <- suppressWarnings(sum(is.na(as.numeric(x))))
    return(numNAs_new == numNAs)
}
Run Code Online (Sandbox Code Playgroud)

它计算NA输入向量中的NAs 和输出中的 sas.numeric()并返回TRUE向量是否可以“安全”转换为numeric(即不添加任何NA附加值)。