簡體   English   中英

合並R中的特定行

[英]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.framecharacter 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM