如何在R中以编程方式分割数据表中的数据

如何在R中以编程方式分割数据表中的数据,r,data.table,plyr,R,Data.table,Plyr,我的代码如下所示: newdata <- ddply(data, .(SIC,FYEAR), function(x){if(nrow(x)>7) x else NULL}); 但是在数据表中有一个等价的解决方案,其中n和列的名称都是通过编程给出的。如果有人能告诉我一个基于数据表的解决方案,那将更有帮助。谢谢 可复制的示例如下所示: require(data.table) data <- data.table(structure(list(SIC = c(1, 1, 1, 1,

我的代码如下所示:

newdata <- ddply(data, .(SIC,FYEAR), function(x){if(nrow(x)>7) x else NULL});
但是在数据表中有一个等价的解决方案,其中n和列的名称都是通过编程给出的。如果有人能告诉我一个基于数据表的解决方案,那将更有帮助。谢谢

可复制的示例如下所示:

require(data.table)
data <- data.table(structure(list(SIC = c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1), FYEAR = c(1999, 1999, 1999, 1999, 1999, 2000, 2000, 
2000, 2000, 2000, 2000, 2000, 2000, 2000, 2000, 2001, 2001, 2001, 
2001, 2001, 2001, 2001, 2001, 2001, 2001, 2002, 2002, 2002, 2002, 
2002, 2002, 2002, 2002, 2002, 2002, 2003, 2003, 2003, 2003, 2003, 
2003, 2003, 2003, 2003, 2003, 2004, 2004, 2004, 2004, 2004, 2004, 
2004, 2004, 2005, 2005, 2005, 2005, 2005, 2005, 2005, 2006, 2006, 
2006, 2006, 2006, 2006, 2006, 2007, 2007, 2007, 2007, 2007, 2008, 
2008, 2008, 2008, 2008, 2009, 2009, 2009, 2009, 2009, 2009, 2010, 
2010, 2010, 2010, 2010, 2010, 2010, 2010, 2011, 2011, 2011, 2011, 
2011, 2011, 2011, 2011, 2012), BIG4 = c(0, 0, 1, 1, 1, 0, 0, 
0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 
1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 
1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 
0, 0, 1, 1, 1, 1, 1, 1, 0)), .Names = c("SIC", "FYEAR", "BIG4"
), row.names = c(31842L, 48128L, 982L, 2173L, 8655L, 31843L, 
55799L, 62384L, 983L, 2174L, 7034L, 8656L, 36790L, 51631L, 69782L, 
31844L, 55800L, 62385L, 984L, 7035L, 8657L, 18874L, 36791L, 51632L, 
69783L, 985L, 7036L, 8658L, 13375L, 18875L, 31845L, 36792L, 51633L, 
62386L, 69784L, 986L, 2177L, 7037L, 8659L, 18876L, 36793L, 51634L, 
55801L, 62387L, 69785L, 36794L, 987L, 2178L, 7038L, 8660L, 18877L, 
51635L, 62388L, 7039L, 36795L, 988L, 2179L, 8661L, 18878L, 62389L, 
19823L, 36796L, 989L, 2180L, 8662L, 18879L, 62390L, 19824L, 36797L, 
2181L, 8663L, 18880L, 19825L, 36798L, 2182L, 8664L, 69790L, 24268L, 
24325L, 36799L, 2183L, 8665L, 31852L, 24269L, 29392L, 36800L, 
2184L, 8666L, 18883L, 31853L, 69792L, 24270L, 36801L, 2185L, 
8667L, 18884L, 26989L, 31854L, 69793L, 30612L), class = "data.frame"))
require(data.table)
数据这个怎么样:

DT<-data.table(df,key=c("SIC","FYEAR"))
DT[,list(BIG4,incl=length(BIG4)>7),by=c("SIC","FYEAR")][incl==T]
DT7),by=c(“SIC”,“FYEAR”)][incl==T]
这个怎么样:

DT<-data.table(df,key=c("SIC","FYEAR"))
DT[,list(BIG4,incl=length(BIG4)>7),by=c("SIC","FYEAR")][incl==T]
DT7),by=c(“SIC”,“FYEAR”)][incl==T]

您可以将
nrow
条件放在
[.data.table
j
参数中,诀窍是使用
数据[0]
返回相同
数据的空版本

# Discard chunks of a data.table which have less than a specified number of rows
throwAwaySmall <- function(data, cols, rowSizeThreshold) {
  data[, .SD[.N>rowSizeThreshold], by=cols]
}

您可以将
nrow
条件放在
[.data.table
j
参数中,诀窍是使用
数据[0]
为未通过所需行数的组返回相同
数据.table
的空版本:

# Discard chunks of a data.table which have less than a specified number of rows
throwAwaySmall <- function(data, cols, rowSizeThreshold) {
  data[, .SD[.N>rowSizeThreshold], by=cols]
}

这里有两种方法

# using .SD
foo.SD <- function(x, .by,.thresh){
        x[,if(.N>.thresh){.SD},by=.by]
      }
# using .I (should be slightly faster as .SD is not loaded into memory for
# each group
foo.I <- function(x, .by,.thresh){
       x[x[,if(.N>.thresh){.I},by=.by]$V1]
 }

foo.SD(data, c('SIC','FYEAR'), 7)
foo.I(data, c('SIC','FYEAR'), 7)
#使用.SD
foo.SD.thresh){.SD},by=.by]
}
#使用.I(应该稍微快一点,因为.SD没有加载到内存中
#每组
foo.I.thresh){.I},by=.by]$V1]
}
foo.SD(数据,c('SIC','FYEAR'),7)
foo.I(数据,c('SIC','FYEAR'),7)

这里有两种方法

# using .SD
foo.SD <- function(x, .by,.thresh){
        x[,if(.N>.thresh){.SD},by=.by]
      }
# using .I (should be slightly faster as .SD is not loaded into memory for
# each group
foo.I <- function(x, .by,.thresh){
       x[x[,if(.N>.thresh){.I},by=.by]$V1]
 }

foo.SD(data, c('SIC','FYEAR'), 7)
foo.I(data, c('SIC','FYEAR'), 7)
#使用.SD
foo.SD.thresh){.SD},by=.by]
}
#使用.I(应该稍微快一点,因为.SD没有加载到内存中
#每组
foo.I.thresh){.I},by=.by]$V1]
}
foo.SD(数据,c('SIC','FYEAR'),7)
foo.I(数据,c('SIC','FYEAR'),7)

我认为我的问题不够清楚。我想用一个通用代码来分割数据,这意味着我可以用(SIC,FYEAR)代替。(BIG4)或(SIC,BIG4)或…我希望你能理解。我想我的问题还不够清楚。我想使用通用代码对数据进行分段,这意味着我可以使用。(SIC,FYEAR)代替。(BIG4)或。(SIC,BIG4)或…我希望你能理解。谢谢,但我想要一个类似的数据表解决方案。@Sumit我现在已将其更改为适当的
data.table
解决方案,或者更简洁地说,
data[,.SD[.N>rowSizeThreshold],by=cols]
@scottrichie代码返回的表只有三列—SIC、FYEAR和给定碎片数据中的行数。它完全忽略其他数据列,不在输出表中返回它们。请注意,这将是低效的,因为它调用
[.data.table
按分组为每个表分配。大量组=大量不必要的开销。谢谢,但我希望为数据表提供类似的解决方案。@Sumit我现在已将其更改为适当的
数据。table
解决方案或更简洁地说,
数据[,.SD[.N>rowSizeThreshold],by=cols]
@scottrichie您的代码返回的表只有三列—SIC、FYEAR和给定碎片数据中的行数。它完全忽略其他数据列,不在输出表中返回它们。请注意,这将在调用
[.data.table
按分组分配给每个组。大量组=大量不必要的开销。