按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%。