【问题标题】:R: Test condition on column of dataframe elements within list; return smaller listR:列表中数据框元素列的测试条件;返回较小的列表
【发布时间】:2013-08-13 18:19:34
【问题描述】:

我的目标是获取数据框列表,查看数据框的特定列的最大值是否为 0,如果是,则从我的列表中删除该数据框。

现在我正在遍历列表的名称。鉴于这是 R,必须有更好的方法。我觉得我需要通过lapply() 应用一些功能才能做到这一点。我也考虑过ddply(),但我认为这可能有点矫枉过正。这是我目前所拥有的:

# Make df of First element
myColumn <- rep ("ElementA",times=10)
values <- seq(1,10)
a <- data.frame(myColumn,values)
# Make df of second element
myColumn <- rep ("ElementB",times=10)
values <- rep(0,10)
b <- data.frame(myColumn,values)

# Bind the dataframes together
df <- rbind(a,b)

#Now split the dataframes based on element name
myList <- split(df,df$myColumn)

# Now loop through element lists and check for max of 0 in values
for (name in names(myList)) { # Loop through List  
  if (max(myList[[name]]$values) == 0) { # Check Max for 0
      myList <- myList[[-names]] # If 0, remove element from list
  } # Close If
} # Close Loop

Error in -names : invalid argument to unary operator

我已经在循环外测试了我的代码,一切似乎都可以正常工作。
任何帮助是极大的赞赏。谢谢!

【问题讨论】:

  • 所有数据框中的列是否相同?
  • 是的。同一列在所有数据框中。

标签: r list function split dataframe


【解决方案1】:

你可以用这个:

myList <- myList[sapply(myList, function(d) max(d$values) != 0)]

而不是for() 循环。这将允许传递具有零行的数据帧,并发出警告。

要确保删除空数据框,请使用以下命令:

myList <- myList[sapply(myList, function(d) if(nrow(d)==0) FALSE else max(d$values)!=0)]

【讨论】:

  • 为了让您了解替代解决方案,使用base R、plyr 以及data.table,您可以在这里查看我的类似问题的几个非常好的答案:@ 987654321@,
  • Henrik - 非常感谢您的评论。你的帖子确实提供了有用的代码,让我离我真正想要的更近了一步(但上面没有要求)。以下代码给出了一个数据框,其中没有那些不符合我的测试条件的列表元素数据框。 shortDf &lt;- ddply(df,"myColumn", subset, max(values) &gt; 0)
猜你喜欢
  • 1970-01-01
  • 2015-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 1970-01-01
相关资源
最近更新 更多