我有一个汇总表:
> aggdata[1:4,]
Group.1 Group.2 x
1 4 0.05 0.9214660
2 6 0.05 0.9315789
3 8 0.05 0.9526316
4 10 0.05 0.9684211
当我有Group.1和Group.2的值时,如何选择x值?
我试过了:
aggdata[aggdata[,"Group.1"]==l && aggdata[,"Group.2"]==lamda,"x"]
但是回复了所有的x。
更多信息: 我想这样用:
table = data.frame();
for(l in unique(aggdata[,"Group.1"])) {
for(lambda in unique(aggdata[,"Group.2"])) {
table[l,lambda] = aggdata[aggdata[,"Group.1"]==l & aggdata[,"Group.2"]==lambda,"x"]
}
}
任何更简单的建议,我都很感激!
答案 0 :(得分:22)
最简单的解决方案是改变“&&”到“&”在你的代码中。
> aggdata[aggdata[,"Group.1"]==6 & aggdata[,"Group.2"]==0.05,"x"]
[1] 0.9315789
我首选的解决方案是使用subset():
> subset(aggdata, Group.1==6 & Group.2==0.05)$x
[1] 0.9315789
答案 1 :(得分:13)
使用&不是&&后者仅评估每个向量的第一个元素。
更新:要回答第二部分,请使用reshape包。这样的事情会做到:
tablex <- recast(aggdata, Group.1 ~ variable * Group.2, id.var=1:2)
# Now add useful column and row names
colnames(tablex) <- gsub("x_","",colnames(tablex))
rownames(tablex) <- tablex[,1]
# Finally remove the redundant first column
tablex <- tablex[,-1]
有更多使用重塑经验的人可能会有一个更简单的解决方案。
注意:不要将table用作变量名,因为它与table()函数冲突。
答案 2 :(得分:8)
关于R数据帧的子集,有一个非常有用的文档: http://www.ats.ucla.edu/stat/r/modules/subsetting.htm
以下是相关摘录:
使用多个子行设置行 条件陈述:没有 限制多少逻辑语句 可以结合起来实现 需要的子集化。数据 frame x.sub1只包含 观察的价值观 变量y大于2和 变量V1更大 比0.6。
x.sub1 <- subset(x.df, y > 2 & V1 > 0.6)