按R中的列表对group的变量进行分类

按R中的列表对group的变量进行分类,r,group-by,R,Group By,我有一个数据集- id date sector region price score 1 SWECEC2 2011-12-31 Finance R1 2.297936 -1.0000000 2 FRACPY1 2011-12-31 FMCG R1 10.500936 -0.8571429 3 FRAACO1 2011-12-31 Finance

我有一个数据集-

    id       date       sector   region     price             score
1   SWECEC2 2011-12-31 Finance     R1    2.297936          -1.0000000
2   FRACPY1 2011-12-31 FMCG        R1   10.500936          -0.8571429
3   FRAACO1 2011-12-31 Finance     R1   19.228936          -0.7142857
4   GERAIM1 2011-12-31 Finance     R1    4.936936          -0.5714286
5   GERAKX1 2011-12-31 Finance     R1    8.140936          -0.5714286
6   NETAHI1 2011-12-31 FMCG        R1   -7.229064          -0.5714286
7   UKIJLK1 2011-12-31 Finance     R2   17.766936          -0.5714286
8   FRAAHJ1 2011-12-31 Finance     R2    5.840936          -0.4285714
9   FRACLB1 2011-12-31 FMCG        R2   -4.490064          -0.4285714
10  GERAIO1 2011-12-31 FMCG        R2    2.338936          -0.4285714
我需要为此数据集创建一个新列,如果分数小于该组日期、部门和地区的平均分数,则该列将一组日期、部门和地区的数据集的每一行分类为1。i、 e.日期=2011-12-32,行业=金融,区域=R1的平均得分为-0.7142857,日期=2011-12-32,行业=快速消费品,区域=R2的平均得分为-0.4285714 依此类推,那么第一组的新列应该是-

id          date    sector  region  price     score      Rating
SWECEC2 12/31/2011  Finance R1      2.297936    -1          1
FRAACO1 12/31/2011  Finance R1      19.228936   -0.7142857  2
GERAIM1 12/31/2011  Finance R1      4.936936    -0.5714286  2
GERAKX1 12/31/2011  Finance R1      8.140936    -0.5714286  2
我想我们可以在ddply中这样做,但我想不出怎么做,因为这里我不是总结数据,只是根据数据表中的每个组创建一个新列

有什么建议吗

谢谢

我的数据集样本在这里-

ds <- structure(list(id = structure(c(9L, 4L, 1L, 5L, 7L, 8L, 10L, 
2L, 3L, 6L), .Label = c("FRAACO1", "FRAAHJ1", "FRACLB1", "FRACPY1", 
"GERAIM1", "GERAIO1", "GERAKX1", "NETAHI1", "SWECEC2", "UKIJLK1"
), class = "factor"), date = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L),     .Label = "12/31/2011", class = "factor"), 
sector = structure(c(1L, 2L, 1L, 1L, 1L, 2L, 1L, 1L, 2L, 
2L), .Label = c("Finance", "FMCG"), class = "factor"), region = structure(c(1L, 
1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L), .Label = c("R1", "R2"
), class = "factor"), price = c(2.297936, 10.500936, 19.228936, 
4.936936, 8.140936, -7.229064, 17.766936, 5.840936, -4.490064, 
2.338936), score = c(-1, -0.8571429, -0.7142857, -0.5714286, 
-0.5714286, -0.5714286, -0.5714286, -0.4285714, -0.4285714, 
-0.4285714)), .Names = c("id", "date", "sector", "region", 
"price", "score"), class = "data.frame", row.names = c(NA, -10L
))
试试这个:

library(plyr)
ddply(ds, .(date, sector, region), function(x) data.frame(x, rate = ifelse(x$score < mean(x$score), 1, 2)))
试试这个:

library(plyr)
ddply(ds, .(date, sector, region), function(x) data.frame(x, rate = ifelse(x$score < mean(x$score), 1, 2)))

这里有一种类似于@koshske的方法,使用dplyr:


这里有一种类似于@koshske的方法,使用dplyr:


不加载库的另一种方法:

  # Split data
  ds.splitted <- split(ds, list(ds$date, ds$sector, ds$region))

  # Function to create Ratings (input: df, output: vector of 1's and 2's)
  myfun <- function(x){
     x.mean.score <- mean(x$score)
     ifelse(x$score < x.mean.score, 1, 2)
  }

  # get the ratings
  lapply(ds.splitted, function(y) cbind(y, Rating = myfun(y)))
或者,也可以将输出列表直接组合到数据帧中:

  ds.ratings <- do.call("rbind",
                        lapply(ds.splitted, function(y) cbind(y, Rating = myfun(y))))

  # to conserve the order in the original ds data frame as rowname:
  rownames(ds.ratings) <- unlist(lapply(ds.splitted, rownames))

不加载库的另一种方法:

  # Split data
  ds.splitted <- split(ds, list(ds$date, ds$sector, ds$region))

  # Function to create Ratings (input: df, output: vector of 1's and 2's)
  myfun <- function(x){
     x.mean.score <- mean(x$score)
     ifelse(x$score < x.mean.score, 1, 2)
  }

  # get the ratings
  lapply(ds.splitted, function(y) cbind(y, Rating = myfun(y)))
或者,也可以将输出列表直接组合到数据帧中:

  ds.ratings <- do.call("rbind",
                        lapply(ds.splitted, function(y) cbind(y, Rating = myfun(y))))

  # to conserve the order in the original ds data frame as rowname:
  rownames(ds.ratings) <- unlist(lapply(ds.splitted, rownames))

它可以通过dplyr中的mutate函数完成,比如ds%。%group_bydate,sector,region%。%mutating=ifelsescoreThank@iugrina-这更优雅。我怀疑有一种方法,但我认为这仍然只会为每组返回一行。很高兴知道这是有效的。如果你觉得一条评论有用,欢迎你随时投票;谢谢!这是快速和伟大的!它可以通过dplyr中的mutate函数完成,比如ds%。%group_bydate,sector,region%。%mutating=ifelsescoreThank@iugrina-这更优雅。我怀疑有一种方法,但我认为这仍然只会为每组返回一行。很高兴知道这是有效的。如果你觉得一条评论有用,欢迎你随时投票;谢谢!这是快速和伟大的!这很简单!谢谢!这很简单!非常感谢@欢迎光临。我甚至测量了这3种解决方案的处理时间,如果您从列表中获取数据帧的最后一步(无论如何只发生一次),这是最快的解决方案。您可以替换do.callrbind。。。行名调用unlist,如下所示:unsplitlapplyds.splitted、functiony cbindy、Rating=myfuny、listds$date、ds$sector、ds$region。我很惊讶,你们发现这种方法比dplyr快,我的微基准表明,它几乎慢了一个数量级,简化到一个数据帧,并且在不简化操作的情况下仍然慢得多。dplyr很快@jbaums谢谢你的邀请。我使用一个20600行的数据帧,用rbenchmark将每个方法的测试复制了10次,并将原始数据帧复制了2060次。最快的方法是不带库并返回data.frames列表的方法,它花费了次快方法50%的时间。如果目标是返回单个数据帧,那么jbaums的dplyr方法就是基准,因为我的数据帧方法需要一个prox。多付20%。@RHelp:欢迎光临。我甚至测量了这3种解决方案的处理时间,如果您从列表中获取数据帧的最后一步(无论如何只发生一次),这是最快的解决方案。您可以替换do.callrbind。。。行名调用unlist,如下所示:unsplitlapplyds.splitted、functiony cbindy、Rating=myfuny、listds$date、ds$sector、ds$region。我很惊讶,你们发现这种方法比dplyr快,我的微基准表明,它几乎慢了一个数量级,简化到一个数据帧,并且在不简化操作的情况下仍然慢得多。dplyr很快@jbaums谢谢你的邀请。我使用一个20600行的数据帧,用rbenchmark将每个方法的测试复制了10次,并将原始数据帧复制了2060次。最快的方法是不带库并返回data.frames列表的方法,它花费了次快方法50%的时间。如果目标是返回单个数据帧,那么jbaums的dplyr方法就是基准,因为我的数据帧方法需要一个prox。多20%。