如何在 R 中根据其元素的长度对列表进行子集化

How to subset a list based on the length of its elements in R

提问人:Hack-R 提问时间:7/30/2014 最后编辑:Hack-R 更新时间:7/30/2014 访问量:7501

问:

在我有一个函数(来自包中),它为您提供的每个 IP 地址查找 11 个数据字段。Rcoordinatessp

我有一个IP列表,叫做:ip.addresses

> head(ip.addresses)
[1] "128.177.90.11"  "71.179.12.143"  "66.31.55.111"   "98.204.243.187" "67.231.207.9"   "67.61.248.12"  

注意:这些或任何其他 IP 可用于重现此问题。

因此,我使用以下命令将该函数应用于该对象:sapply

ips.info     <- sapply(ip.addresses, ip2coordinates)

并得到一个列表作为我的结果。这一切都很好,但我无法对列表做更多的事情,所以我需要将其转换为数据帧。问题是并非所有 IP 地址都在数据库中,因此某些列表元素只有 1 个字段,我收到此错误:ips.info

> ips.df       <- as.data.frame(ips.info)
Error in data.frame(`128.177.90.10` = list(ip.address = "128.177.90.10",  : 

参数表示不同的行数:1、0

我的问题是 -- “如何删除数据缺失/不完整的元素,或者以其他方式将此列表转换为每个 IP 地址有 11 列和 1 行的数据框?

我尝试了几件事。

  • 首先,我尝试编写一个循环,删除长度小于 11 的元素

    for (i in 1:length(ips.info)){
    if (length(ips.info[i]) < 11){
    ips.info[i] <- NULL}}
    

这会使一些记录没有数据,并使其他记录显示“NULL”,但即使是那些带有“NULL”的记录也不会被检测到is.null

  • 接下来,我用双方括号尝试了同样的事情,并得到

    Error in ips.info[[i]] : subscript out of bounds
    
  • 我还试图看看它是否可能有用complete.cases()

    Error in complete.cases(ips.info) : not all arguments have the same length
    
  • 最后,我尝试了我的循环的变体,该变体以将完整的记录作为条件并写入另一个对象,但不知何故,它导致了 ips.info 的精确副本forlength(ips.info[[i]] == 11

r 列表 子集

评论


答:

7赞 MrFlick 7/30/2014 #1

以下是使用内置函数完成此操作的一种方法Filter

#input data
library(RDSTK)
ip.addresses<-c("128.177.90.10","71.179.13.143","66.31.55.111","98.204.243.188",
    "67.231.207.8","67.61.248.15")
ips.info  <- sapply(ip.addresses, ip2coordinates)

#data.frame creation
lengthIs <- function(n) function(x) length(x)==n
do.call(rbind, Filter(lengthIs(11), ips.info))

或者,如果您不想使用帮助程序函数

do.call(rbind, Filter(function(x) length(x)==11, ips.info))
7赞 DrDom 7/30/2014 #2

基于软件包的替代解决方案。base

  # find non-complete elements
  ids.to.remove <- sapply(ips.info, function(i) length(i) < 11)
  # remove found elements
  ips.info <- ips.info[!ids.to.remove]
  # create data.frame
  df <- do.call(rbind, ips.info)

评论

0赞 Hack-R 7/30/2014
+1 表示使用内置函数。我已经在运行 RDSTK,所以我没有回去验证您的解决方案,但它看起来不错
0赞 DrDom 7/30/2014
我认为这是解决任务的一种更优雅的方式。Filter
0赞 MrFlick 7/30/2014
RDSTK 唯一来自函数的是函数。我使用的其他一切都是 R 基数。ip2coordinates