我有一个巨大的数据框架。我卡住了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中,从而无法出席,我已经通过我自己做了任何合理的代码。
任何帮助将不胜感激。
我有一个巨大的数据框架。我卡住了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中,从而无法出席,我已经通过我自己做了任何合理的代码。
任何帮助将不胜感激。
如上所述,您的问题没有明确说明。
也许你正在寻找做这样的事情:
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.
我非常抱歉,我无法很好地解释我需要什么,但是你做了什么完全是我所期待的。非常感谢你!) – Jack
既然你说你的数据框很大,你可能想用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
您还可以包含所需输出的样本吗?从问题陈述中很难理解。 – ilir