R:如果功能有两个条件?

时间:2014-05-05 17:51:15

标签: r if-statement conditional-statements

我有一个庞大的数据框架。我被if函数困住了。让我先介绍一个简单的例子,然后我解决我的问题:

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)

问题:我想运行如果函数对基于 y a <的行的列 z 值求和/ strong>仅当每个组的第二行具有相应的 z 等于1

我很抱歉,但我是R的新手,所以无法提供我自己做的任何合理的代码。

任何帮助都将受到高度赞赏。

2 个答案:

答案 0 :(得分: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

在这里,我创建了一个新专栏&#34; new&#34;它总结了&#34; z&#34;的值。按&#34; y&#34;分组和&#34; a&#34;,但仅当组中的第二个值等于1时才会显示。

答案 1 :(得分:1)

由于您说您的数据框非常大,您可能希望使用data.table包将数据框转换为data.table对象。如果你有很多行,你可能会发现所需的操作要快得多。但是,使用data.table为您的案例构建代码并不简单。

如果我知道你想做什么(这对我来说并不完全清楚),你可以尝试以下方法:

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的列a上创建总和,我将z列作为键。语法xx [1,sum(a)]对键值(z值)为1的位置求和。

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

如果您打算以严肃的方式使用data.table,请研究该软件包可用的信息小插图。

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