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

时间:2017-04-04 17:57:34

标签: r purrr

我有一个data.frame,df,其中一列有条目或列表

enter image description here

我想使用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

2 个答案:

答案 0 :(得分:1)

这是使用lengths和子集化的基本R方法。 date_of_birth列中具有多个元素的任何元素都将被删除

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

返回

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)

答案 1 :(得分:1)

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

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

编辑:

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

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

我希望这会有所帮助。