Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R子集数据帧并基于列执行函数_R_Dataframe_Plyr - Fatal编程技术网

R子集数据帧并基于列执行函数

R子集数据帧并基于列执行函数,r,dataframe,plyr,R,Dataframe,Plyr,样本数据。我还不知道如何使用代码块系统 df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(1990,1991,1992,1990,1991,1992,1990,1991,1992),c(1,2,3,3,2,1,2,1,3)) colnames(df) <- c("id", "year", "value") df您需要了解ddply根据拆分变量将原始data.frame拆分为data.frames。因此,它需要一个data.frame作为参数和返回值的函

样本数据。我还不知道如何使用代码块系统

df <- data.frame(c(1,1,1,2,2,2,3,3,3),c(1990,1991,1992,1990,1991,1992,1990,1991,1992),c(1,2,3,3,2,1,2,1,3))
colnames(df) <- c("id", "year", "value")

df您需要了解
ddply
根据拆分变量将原始data.frame拆分为data.frames。因此,它需要一个data.frame作为参数和返回值的函数

library(plyr)
ddply(df,.(id),function(DF) {res <- DF[which.max(DF$value),]
                             res[which.min(res$year),]})

#   id year value
# 1  1 1992     3
# 2  2 1990     3
# 3  3 1992     3
库(plyr)

ddply(df,.(id),function(df){res我相信
data.table
是您的最佳工具(无论是出于速度还是语法原因):


谢谢!我还没有在R中编写过很多函数,所以这就是我学习的地方。如果我理解的话,ddply会生成一个数据帧,它可以由一个函数语句来操作(如上面所述).准确地说,
ddply
拆分为data.frames,然后传递给函数。函数将data.frames返回到
ddply
,然后再将它们组合在一起。我已经返回到您编写的这个函数4次了-这很完美,罗兰。这似乎也很有效-它与罗兰发布的结果相匹配。比艾迪,太多了。
library(data.table)
dt = data.table(df)

# order by year, and then take the first row for each id that has max 'value'
dt[order(year), .SD[which.max(value)], by = id]
#   id year value
#1:  1 1992     3
#2:  2 1990     3
#3:  3 1992     3

# if you're after speed, this slightly worse syntax is the current way of achieving it
dt[dt[order(year), .I[which.max(value)], by = id]$V1]