【问题标题】:Remove NAs from each variable (column) and combine cases从每个变量(列)中删除 NA 并合并案例
【发布时间】:2015-10-22 21:24:01
【问题描述】:

我有一个我正在清理的数据集,并且有一些我想合并的行(观察)。解释我正在尝试做的最好方法是使用以下示例:

df<-data.frame(fruits=c("banana","banana","pineapple","kiwi"),cost=c(1,NA,2,3),weight=c(NA,1,2,3),stringsAsFactors = F)
df

cost<-df[,1:2]
weight<-df[,c(1,3)]

cost
weight

cost<-cost[complete.cases(cost),]
weight<-weight[complete.cases(weight),]

key<-data.frame(fruits=unique(df[,1]))
key

mydata<-merge(key,cost,by="fruits",all.x = T)
mydata<-merge(mydata,weight,by="fruits",all.x = T)

mydata

在前面的示例中,我想保留香蕉的两个变量(成本和重量)的信息,但不幸的是它在不同的记录中。我可以为一个变量手动完成此操作,但我的实际数据集有几十个变量。我想知道如何完成上面完成的任务,但使用 dplyr 或应用于一组列。

【问题讨论】:

  • 这个问题需要更多数据——我们可以假设每个项目的成本总是相同的吗?我们可以假设成本和重量总是相同的吗?您的原始数据看起来像 df 还是像成本和重量?
  • 在这里看到你在做什么真的很麻烦,因为你坚持要覆盖你创建的每一个对象。

标签: r dplyr split-apply-combine


【解决方案1】:

我们也可以使用组合dplyr + tidyr

library(dplyr)
library(tidyr)

df %>%
  gather(key, value, -fruits) %>%
  group_by(fruits) %>%
  na.omit() %>%
  spread(key, value)
## Source: local data frame [3 x 3]

##      fruits  cost weight
##       (chr) (dbl)  (dbl)
## 1    banana     1      1
## 2      kiwi     3      3
## 3 pineapple     2      2

编辑

您可能想检查更短的@Frank 解决方案并仅使用dplyr

df %>%
  group_by(fruits) %>%
  summarise_each(funs(na.omit))

【讨论】:

  • 或者只是df %&gt;% group_by(fruits) %&gt;% summarise_each(funs(na.omit))
  • @Frank 谢谢,我认为使用你的方法会更好。
  • @Frank 我会说你的 aporoach 看起来非常熟悉 :)
【解决方案2】:

使用data.table 我想要类似的东西

library(data.table)
setDT(df)[, lapply(.SD, function(x) x[!is.na(x)]), by = fruits]
#       fruits cost weight
# 1:    banana    1      1
# 2: pineapple    2      2
# 3:      kiwi    3      3

一个更干净但可能更慢的选项是

setDT(df)[, lapply(.SD, na.omit), by = fruits]
#       fruits cost weight
# 1:    banana    1      1
# 2: pineapple    2      2
# 3:      kiwi    3      3

【讨论】:

  • 我很确定这是重复的。
猜你喜欢
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多