我有一个庞大的数据框架。我被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的新手,所以无法提供我自己做的任何合理的代码。
任何帮助都将受到高度赞赏。
答案 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