我是R.的新手.这是我的具体问题.假设我正在使用下面这个名为"data"的数据集.我的标题是state,type和value.
structure(list(state = structure(c(1L, 1L, 1L, 1L, 2L, 2L), .Label = c("AK",
"AL"), class = "factor"), type = structure(c(2L, 2L, 1L, 1L,
2L, 1L), .Label = c(" D", " R"), class = "factor"), value = c(100L,
200L, 100L, 150L, 100L, 150L)), .Names = c("state", "type", "value"
), class = "data.frame", row.names = c(NA, -6L))
state type value
1 AK R 100
2 AK R 200
3 AK D 100
4 AK D 150
5 AL R 100
6 AL D 150
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数,它将为每种类型和状态添加值.例如.对于AK类型R,输出将为300.对于AK类型D,输出将为250.对于AL类型R,输出将为100,对于AL类型D,输出将为150.
不是plyr,而是公正的 aggregate
> aggregate(value~state+type, data=data,FUN=sum)
state type value
1 AK D 250
2 AL D 150
3 AK R 300
4 AL R 100
Run Code Online (Sandbox Code Playgroud)
你可以使用 tapply
data <- read.csv(header=TRUE,text="state, type, value
AK, R, 100
AK, R, 200
AK, D, 100
AK, D, 150
AL, R, 100
AL, D, 150")
tapply(data$value, list(data$state,data$type), sum)
# D R
# AK 250 300
# AL 150 100
Run Code Online (Sandbox Code Playgroud)
虽然@Matthew Lundberg的答案是最好的,但这里有一些替代方案.
如果你真的想使用plyr,你可以这样做:
ddply(DF, .(state, type), numcolwise(sum))
state type value
1 AK D 250
2 AK R 300
3 AL D 150
4 AL R 100
Run Code Online (Sandbox Code Playgroud)
这是使用reshape2包的另一种解决方案
library(reshape2)
dcast( melt(DF), state + type ~ variable, sum)
Using state, type as id variables
state type value
1 AK D 250
2 AK R 300
3 AL D 150
4 AL R 100
Run Code Online (Sandbox Code Playgroud)
如果你只想要一个向量,那么这可能是有用的:
sapply(with(DF, split(value, list(state, type))), sum)
AK.D AL.D AK.R AL.R
250 150 300 100
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
113 次 |
| 最近记录: |