[英]Merging specific rows in R
我只想合並我df的某些行的列值。 例如在以下df中,
name time value
1 n1 1 10
2 n2 2 12
3 a 3 6
4 b 3 NA
5 n3 4 4
我想合並第3行和第4行,以便最終的df是,
name time value
1 n1 1 10
2 n2 2 12
3 a 3 6
5 n3 4 4
在嘗試了不同的方法后,我選擇了
df1 <- ddply(df,
.(time), #Split by time as events "a","b" will always same time
function(y){
if(all(y$name %in% c("a","b"))){ #Dont combine rows without "a"|"b"
y<-data.frame(t(apply(y, 2, min, na.rm=T))) #adply doesn't seem to work?
print(y) #Added here for debugging
}
y
}
)
打印聲明會產生正確的答案,
name time value
1 a 3 6
但是輸出df1是
name time value
1 n1 1 10
2 n2 2 12
3 a 1 1
4 n3 4 4
我不知道1是怎么來的?
您為什么不能使用duplicated
刪除重復的time
值(行)?
> dat
# name time value
# 1 n1 1 10
# 2 n2 2 12
# 3 a 3 6
# 4 b 3 NA
# 5 n3 4 4
> dat[!duplicated(dat$time), ]
# name time value
# 1 n1 1 10
# 2 n2 2 12
# 3 a 3 6
# 5 n3 4 4
問題是類型轉換。 在你的apply
調用, data.frame
被轉換成一個matrix
式的character
。 當您將其轉換為data.frame
, character
s將轉換為factor
。 然后,在組合結果時,該factor
將轉換為numeric
。 為了避免轉換為因子,可以使用stringsAsFactors=FALSE
,您的代碼將起作用。
df1 <- ddply(df,
.(time), #Split by time as events "a","b" will always same time
function(y){
if(all(y$name %in% c("a","b"))){ #Dont combine rows without "a"|"b"
y<-data.frame(t(apply(y, 2, min, na.rm=T)), stringsAsFactors=FALSE)
}
y
}
)
無論如何,這是一個替代解決方案,它更易於閱讀,更少出錯且可能更快。
require(data.table)
dt <- data.table(df)
dt[name %in% c("a","b"), `:=`(name=name[1], value=min(value, na.rm=TRUE)), by=time]
unique(dt)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.