如何使用 purrr 来限制列元素不是列表的行

How can I use purrr to limit rows where column element is not a list

我有一个 data.frame,df,其中一列包含字符或列表的条目

我想使用 purrr 包或其他方式来消除第二行

df <- structure(list(member_id = c("1715", "2186", "2187"), date_of_birth = list(
"1953-12-15T00:00:00", structure(list(`@xsi:nil` = "true", 
    `@xmlns:xsi` = "http://www.w3.org/2001/XMLSchema-instance"), .Names = c("@xsi:nil", 
"@xmlns:xsi")), "1941-02-16T00:00:00")), .Names = c("member_id", 
"date_of_birth"), row.names = c(1L, 8L, 9L), class = "data.frame")

TIA

这是使用 lengths 和子集化的基础 R 方法。 date_of_birth 列中包含一个以上元素的任何元素都将被删除

dfNew <- df[lengths(df$date_of_birth) < 2,]

哪个returns

dfNew
  member_id       date_of_birth
1      1715 1953-12-15T00:00:00
9      2187 1941-02-16T00:00:00

请注意,dfNew$date_of_birth 仍将是列表类型,这可能会导致后续问题。您可以使用 unlist.

解决此问题
dfNew$date_of_birth <- unlist(dfNew$date_of_birth)

如果您希望删除 date_of_birth 字段类型为 list 的任何行,以下应该是一个不错的解决方案:

df[sapply(df$date_of_birth, function(x) typeof(x)!="list"),]

编辑:

Imo 的评论应该将上述解决方案缩短如下:

df[!sapply(df$date_of_birth, is.list),]

希望对您有所帮助。