我有一个像这样的数据框:
a b c d e f g
1 Car 10/02 01/02 30/02 14 1 NA
2 Car 10/02 07/02 20/02 0 NA 7
我想得到:
a b c d e f g
1 Car 10/02 01/02 20/02 14 1 7
像(a,b)一样,为c和d选择最短日期,为e选择最大日期,为f和g选择非null
如何在R中解决它?
答案 0 :(得分:0)
使用data.table。我必须更改您的约会日期之一,因为2月30日没有时间
x <- data.frame(
a= c( "Car","Car"), b=c("10/20","10/20"), c=c("01/02","07/02"),d=c("28/02","20/02"), e=c(14,0), f=c(1, NA), g=c(NA,7))
library( data.table) # you may need to install
x <- data.table( x )
#convert to dates
x$c <- as.Date(x$c, "%d/%m")
x$d <- as.Date(x$d, "%d/%m")
# group as you specfied
x[ ,
.(
c = min( c ),
d = min( d ),
e = max( e ),
f= max( f , na.rm=T),
g= max( g , na.rm=T)
) ,
by= c( "a","b")
]
答案 1 :(得分:0)
使用dplyr
,我们可以group_by
a
和b
,使用c
将d
和dmy
转换为实际日期, lubridate
并选择最短日期,选择max
的最大值e
和非NA值f
和g
。
library(dplyr)
library(lubridate)
df %>%
group_by(a, b) %>%
summarise(c = c[which.min(dmy(paste0(c, "/19")))],
d = d[which.min(dmy(paste0(d, "/19")))],
e = max(e),
f = f[!is.na(f)],
g = g[!is.na(g)])
# a b c d e f g
# <fct> <fct> <fct> <fct> <dbl> <int> <int>
#1 Car 10/02 01/02 20/02 14 1 7
如示例中所示,假设f
和g
仅具有一个非NA值,如果您有多个,则使用which.max
选择第一个这些列中的非NA值。
答案 2 :(得分:0)
使用库dplyr,假设您的数据框为df。首先是将NA替换为0
df[is.na(df)] <- 0 # you can now directly take sum of f and g column in group by
library(dplyr)
df_1 <- df %>% group_by(a,b) %>% summarise(c = min(c),d = min(d),e = max(e),f = sum(f),g = sum(g))