2014-05-05 49 views
0

我有一个巨大的数据框架。我卡住了if函数。让我先介绍简单的例子,然后我放下我的问题:R:如果函数有两个条件?

z <- c(0,1,2,3,4,5) 
y <- c(2,2,2,3,3,3) 
a <- c(1,1,1,2,2,2) 
x <- data.frame(z,y,a) 

问题:我想运行,如果函数总结列ž值基于对于具有相同Ÿ行只有当每个组的第二行有相应的ž一个等于1

我很抱歉,但我很新R中,从而无法出席,我已经通过我自己做了任何合理的代码。

任何帮助将不胜感激。

+2

您还可以包含所需输出的样本吗?从问题陈述中很难理解。 – ilir

回答

3

如上所述,您的问题没有明确说明。

也许你正在寻找做这样的事情:

x$new <- with(x, ave(z, y, a, FUN = function(k) 
    ifelse(k[2] == 1, sum(k), NA))) 
x 
# z y a new 
# 1 0 2 1 3 
# 2 1 2 1 3 
# 3 2 2 1 3 
# 4 3 3 2 NA 
# 5 4 3 2 NA 
# 6 5 3 2 NA 

在这里,我创建了一个新栏目“新”的总结“Z”由“Y”和“a”组合的价值,但前提是组中的第二个值等于1.

+0

我非常抱歉,我无法很好地解释我需要什么,但是你做了什么完全是我所期待的。非常感谢你!) – Jack

1

既然你说你的数据框很大,你可能想用data.table包把你的数据框转换成data.table对象。如果你有很多行,你可能会发现所需的操作要快得多。但是,针对您的案例的代码的构建并不直接与data.table。

如果我understnad你想做的事(这是不完全清楚,我),你可以尝试以下方法:

library(data.table) 
z <- c(0,1,2,3,4,5) 
y <- c(2,2,2,3,3,3) 
a <- c(1,1,1,2,2,2) 
x <- data.frame(z,y,a) 
xx <- as.data.table(x) # Make a data.table object 
setkey(xx, z) # Make the z column a key 
xx[1, sum(a)] # Sum all values in column a where the key z = 1 
[1] 1 
# Now try the other sum you mention 
xx[, sum(z), by = list(z = y)] # A column sum over groups defined by z = y 
    z V1 
1: 2 2 
2: 3 3 
sum(xx[, sum(z), by = list(z = y)][, V1]) # Summing over the sums for each group should do it 
[1] 5 

要通过列创建的总和,其中z = 1,我做了z列一个键。语法xx [1,sum(a)]将键值(z值)为1的位置相加。

我可以使用by创建具有data.table对象的组,它类似于SQL WHERE子句if你熟悉SQL。但是,结果是创建的每个组的z列的总和。如果你有很多可能的匹配值,其中z = y,这可能是低效的。外部总和为内部结果的子选择的V1列中的每个组添加值。

如果您打算以认真的方式使用data.table,请研究可用于该包的信息性小插件。

M Dowle,T Short,S Lianoglou,Srinivasan与R Saporta和E Antonyan(2014)的贡献。 data.table:data.frame的扩展。 R软件包版本1.9.2。 http://CRAN.R-project.org/package=data.table