合并R中的特定行

合并R中的特定行,r,merge,plyr,R,Merge,Plyr,我只想合并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 我的方法

我只想合并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
               }
             )
但是输出df1是

  name time value
1   n1    1    10
2   n2    2    12
3    a    1     1
4   n3    4     4

我不知道1是怎么来的???

问题是类型转换。在
apply
调用中,
data.frame
被转换为
字符类型的
矩阵。将其转换为
data.frame
时,
字符
将转换为
因子
。然后当组合结果时,
因子
被转换为
数值
。为了避免转换为因子,您可以使用
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
             }
)

df1为什么不能使用
duplicated
删除重复的
time
值(行)


匿名函数中没有返回值。如果{}
块是返回语句,则在
print(y)
y
之后立即添加一个返回值!嘿,谢谢你的快速回复。您还知道为什么
adply(y,2,min,na.rm=T)
会抛出一个错误
error:仅在包含所有数值变量的数据帧上定义
此外,您的第二种方法更好,但我的实际数据帧包含18列,我不想为每个列添加一个min语句。有更好的方法吗?谢谢哦这只是一个示例场景,我的实际案例由多个值列组成,我需要为名称为“a”|“b”的连续行取最小值
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) 
> 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