Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 用于循环或应用函数来分离和求和变量_R - Fatal编程技术网

R 用于循环或应用函数来分离和求和变量

R 用于循环或应用函数来分离和求和变量,r,R,我有一个数据框,其中有多组变量,我需要提取每个组并创建一个新变量,它是每个组的行和。每个组都可以识别,因为它们包含0-5之间的数字 目前,我正在通过以下方式分别提取和汇总各组: sum_cols <- function(x, col1, col2, col3){ x[[col1]] + x[[col2]] + x[[col3]] } test %>% select(contains('0')) %>% mutate( p0 = sum_cols(x = .

我有一个数据框,其中有多组变量,我需要提取每个组并创建一个新变量,它是每个组的行和。每个组都可以识别,因为它们包含0-5之间的数字

目前,我正在通过以下方式分别提取和汇总各组:

sum_cols <- function(x, col1, col2, col3){
  x[[col1]] + x[[col2]] + x[[col3]]
}

test %>%
  select(contains('0')) %>%
  mutate(
    p0 = sum_cols(x = ., col1 = 1, col2 = 2, col3 = 3)
  ) %>% pull(p0)

使用
map\u dfc
循环通过
paste0('p',0:5)
选择
转换当前
p
,然后将Ps组合在一起


我们还可以使用base R
split.default
根据名称中的公共子字符串(“p”后跟一个数字)拆分列,然后使用
sapply
获取每组的
行和

df <- test[-1]
data.frame(sapply(split.default(df, sub(".*(P\\d+).*", "\\1", names(df))), rowSums))

#      P0      P1     P2    P3      P4     P5
#1  6.882 298.560 -0.372 0.350 274.384 -4.510
#2  6.344 297.785 -1.686 1.144 275.994 -4.510
#3  6.627 299.074 -1.688 0.597 275.160 -5.027
#4  6.089 298.815 -0.893 0.325 275.976 -4.773
#5  5.017 299.070 -1.947 0.874 275.441 -5.573
#6  5.037 299.355 -0.631 0.600 276.499 -4.228
#7  4.227 298.817 -1.688 0.604 275.977 -4.753
#8  4.487 299.074 -1.431 0.069 275.460 -5.311
#9  5.297 299.103 -1.692 0.325 277.314 -5.053
#10 5.817 299.345 -1.154 0.325 275.723 -4.773

非常感谢。我从未想到过使用
purrr
library(dplyr)
library(purrr)
#use map if you need the output as a list
map_dfc(paste0('P',0:5), 
         ~select(test, contains(.x)) %>% transmute(!!.x := rowSums(., na.rm = TRUE)))

      P0      P1     P2    P3      P4     P5
1  6.882 298.560 -0.372 0.350 274.384 -4.510
2  6.344 297.785 -1.686 1.144 275.994 -4.510
3  6.627 299.074 -1.688 0.597 275.160 -5.027
4  6.089 298.815 -0.893 0.325 275.976 -4.773
5  5.017 299.070 -1.947 0.874 275.441 -5.573
6  5.037 299.355 -0.631 0.600 276.499 -4.228
7  4.227 298.817 -1.688 0.604 275.977 -4.753
8  4.487 299.074 -1.431 0.069 275.460 -5.311
9  5.297 299.103 -1.692 0.325 277.314 -5.053
10 5.817 299.345 -1.154 0.325 275.723 -4.773
df <- test[-1]
data.frame(sapply(split.default(df, sub(".*(P\\d+).*", "\\1", names(df))), rowSums))

#      P0      P1     P2    P3      P4     P5
#1  6.882 298.560 -0.372 0.350 274.384 -4.510
#2  6.344 297.785 -1.686 1.144 275.994 -4.510
#3  6.627 299.074 -1.688 0.597 275.160 -5.027
#4  6.089 298.815 -0.893 0.325 275.976 -4.773
#5  5.017 299.070 -1.947 0.874 275.441 -5.573
#6  5.037 299.355 -0.631 0.600 276.499 -4.228
#7  4.227 298.817 -1.688 0.604 275.977 -4.753
#8  4.487 299.074 -1.431 0.069 275.460 -5.311
#9  5.297 299.103 -1.692 0.325 277.314 -5.053
#10 5.817 299.345 -1.154 0.325 275.723 -4.773
sub(".*(P\\d+).*", "\\1", names(df))
# [1] "P0" "P0" "P0" "P1" "P1" "P1" "P2" "P2" "P2" "P3" "P3" "P3" "P4" "P4" "P4" 
#     "P5" "P5" "P5"