有条件For循环的数据帧中每列的总和

时间:2018-12-04 17:19:12

标签: r for-loop

因此,我想遍历数据集并根据第一列的条件求和每一列的值。到目前为止的数据和我的代码如下:

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

2 个答案:

答案 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