首页 > 解决方案 > 使用条件 For 循环对数据框中每一列的值求和

问题描述

所以我想通过一个数据集并根据我的第一列的条件对每一列的值求和。到目前为止的数据和我的代码如下所示:

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

标签: rfor-loop

解决方案


这是一个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) 指示每行属于哪个组,按此标签分组,并v使用sum.

# Load library
library(dplyr)

df %>% 
  mutate(x_check = ifelse(x>2, "x1", "x2")) %>% 
  group_by(x_check) %>% 
  summarise_at(vars(contains("v")), funs(sum))

# # A tibble: 2 x 4
#   x_check    v1    v2    v3
#   <chr>   <int> <int> <int>
# 1 x1          6     7    35
# 2 x2          4     3    15

推荐阅读