因此,我想遍历数据集并根据第一列的条件求和每一列的值。到目前为止的数据和我的代码如下:
x v1 v2 v3
1 0 1 5
2 4 2 10
3 5 3 15
4 1 4 20
for(i in colnames(data)){
if(data$x>2){
x1 <-sum(data[[i]])
}
else{
x2 <-sum(data[[i]])
}
}
我的假设是for循环将按名称从数据中调用每一列,然后根据它们是否符合x列的条件对每列中的值求和。
我想将每一列的值相加一半,并将它们分配给值x1,其余部分也做同样的事情,将其分配给x2。我不断收到以下错误消息:
the condition has length > 1 and only the first element will be used
我做错了什么,还有更好的方法解决吗?理想情况下,我想要一个看起来像这样的表:
v1 v2 v3
x1 6 7 35
x2 4 3 15
答案 0 :(得分:0)
这是一个dplyr
解决方案。首先,我定义数据框。
df <- read.table(text = "x v1 v2 v3
1 0 1 5
2 4 2 10
3 5 3 15
4 1 4 20", header = TRUE)
# x v1 v2 v3
# 1 1 0 1 5
# 2 2 4 2 10
# 3 3 5 3 15
# 4 4 1 4 20
然后,我创建一个标签(x_check
)以根据您的条件(x > 2
)来指示每一行属于哪个组,按此标签分组,并用{{1 }},其名称使用v
。
sum
答案 1 :(得分:0)
不确定我是否正确理解了您的意图,但这是您如何使用基数R复制结果的方法:
df <- data.frame(
x = c(1:4),
v1 = c(0, 4, 5, 1),
v2 = 1:4,
v3 = (1:4)*5
)
x1 <- colSums(df[df$x > 2, 2:4, drop = FALSE])
x2 <- colSums(df[df$x <= 2, 2:4, drop = FALSE])
哪里
df[df$x > 2, 2:4, drop = FALSE]
将创建df
的子集,其中行满足df$x > 2
,列为2:4
(表示第二,第三和第四列),{{1 }}主要是为了防止R在某些特殊情况下简化结果drop = FALSE
对子集数据进行逐列求和。如果您的colSums
列确实是一个条件(例如x
),您可以这样做
logical vector
请注意,获取结果不需要循环,使用R时,应尽可能使用向量化函数。
更一般而言,您可以使用x1 <- colSums(df[df$x, 2:4, drop = FALSE])
x2 <- colSums(df[!df$x, 2:4, drop = FALSE])
进行这种聚合:
aggregate