从每个变量(列)中删除 NA 并合并案例
Remove NAs from each variable (column) and combine cases
我有一个正在清理的数据集,并且有一些我想合并的行(观察)。解释我正在尝试做的事情的最好方法是使用以下示例:
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 或应用于一组列。
使用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
我们也可以使用组合 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<-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 或应用于一组列。
使用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
我们也可以使用组合 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))