当前位置: 首页 > 知识库问答 >
问题:

使用列范围或选择模式计算(按行)列

柴耀
2023-03-14
gl <- tibble::tribble(
                   ~X4010, ~X4020, ~X4030,  ~X5010, ~X5020, ~X5030, ~X5040,
                     1000,    100,     10,     500,    100,     50,      5,
                     1100,    110,     11,     550,    110,     55,    5.5,
                     1210,    121,   12.1,     605,    121,   60.5,   6.05,
                     1331,  133.1,  13.31,   665.5,  133.1,  66.55,   6.65,
                   1464.1, 146.41,  14.64,  732.05, 146.41,   73.2,   7.32,
                  1610.51, 161.05,   16.1,  805.25, 161.05,  80.52,   8.05,
                  1771.56, 177.15,  17.71,  885.78, 177.15,  88.57,   8.85,
                  1948.71, 194.87,  19.48,  974.35, 194.87,  97.43,   9.74,
                  2143.58, 214.35,  21.43, 1071.79, 214.35, 107.17,  10.71,
                  2357.94, 235.79,  23.57, 1178.97, 235.79, 117.89,  11.78
                  )

需要创建两个计算列,按行方式添加列,如下所示:

gl %>% 
  mutate(C1 = X4010+X4020+X4030, C2 =  X5010+X5020+X5030+X5040 )

但是,由于X变量的数量非常大,因此我想指定诸如X4010:X4030select(starts_with(“X40”))之类的范围,而不是添加单个列。

如何修改< code>C1和< code>C2的公式以使用该范围或模式?谢了。

所需的输出如下:

result <- tibble::tribble(
                   ~X4010, ~X4020, ~X4030,  ~X5010, ~X5020, ~X5030, ~X5040,     ~C1,     ~C2,
                     1000,    100,     10,     500,    100,     50,      5,    1110,     655,
                     1100,    110,     11,     550,    110,     55,    5.5,    1221,   720.5,
                     1210,    121,   12.1,     605,    121,   60.5,   6.05,  1343.1,  792.55,
                     1331,  133.1,  13.31,   665.5,  133.1,  66.55,   6.65, 1477.41,   871.8,
                   1464.1, 146.41,  14.64,  732.05, 146.41,   73.2,   7.32, 1625.15,  958.98,
                  1610.51, 161.05,   16.1,  805.25, 161.05,  80.52,   8.05, 1787.66, 1054.87,
                  1771.56, 177.15,  17.71,  885.78, 177.15,  88.57,   8.85, 1966.42, 1160.35,
                  1948.71, 194.87,  19.48,  974.35, 194.87,  97.43,   9.74, 2163.06, 1276.39,
                  2143.58, 214.35,  21.43, 1071.79, 214.35, 107.17,  10.71, 2379.36, 1404.02,
                  2357.94, 235.79,  23.57, 1178.97, 235.79, 117.89,  11.78,  2617.3, 1544.43
                  )

共有3个答案

鲁洋
2023-03-14

我们还可以使用<code>pivot_longer

library(dplyr)
library(tidyr)
gl %>% 
     mutate(rn = row_number()) %>%
     pivot_longer(cols = -rn, names_to = c('.value', 'grp'), 
        names_pattern = '^(X\\d)(.*)') %>%
     group_by(rn) %>% 
     summarise(across(starts_with('X'), sum, na.rm = TRUE)) %>% 
     select(-rn) %>% 
     bind_cols(gl, .)
# A tibble: 10 x 9
#   X4010 X4020 X4030 X5010 X5020 X5030 X5040    X4    X5
#   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
# 1 1000   100   10    500   100   50    5    1110   655 
# 2 1100   110   11    550   110   55    5.5  1221   720.
# 3 1210   121   12.1  605   121   60.5  6.05 1343.  793.
# 4 1331   133.  13.3  666.  133.  66.6  6.65 1477.  872.
# 5 1464.  146.  14.6  732.  146.  73.2  7.32 1625.  959.
# 6 1611.  161.  16.1  805.  161.  80.5  8.05 1788. 1055.
# 7 1772.  177.  17.7  886.  177.  88.6  8.85 1966. 1160.
# 8 1949.  195.  19.5  974.  195.  97.4  9.74 2163. 1276.
# 9 2144.  214.  21.4 1072.  214. 107.  10.7  2379. 1404.
#10 2358.  236.  23.6 1179.  236. 118.  11.8  2617. 1544.
耿锦
2023-03-14

使用split.default-

cbind(gl, sapply(split.default(gl, sub('(X\\d).*', '\\1', names(gl))), rowSums))

#     X4010  X4020 X4030   X5010  X5020  X5030 X5040      X4      X5
#1  1000.00 100.00 10.00  500.00 100.00  50.00  5.00 1110.00  655.00
#2  1100.00 110.00 11.00  550.00 110.00  55.00  5.50 1221.00  720.50
#3  1210.00 121.00 12.10  605.00 121.00  60.50  6.05 1343.10  792.55
#4  1331.00 133.10 13.31  665.50 133.10  66.55  6.65 1477.41  871.80
#5  1464.10 146.41 14.64  732.05 146.41  73.20  7.32 1625.15  958.98
#6  1610.51 161.05 16.10  805.25 161.05  80.52  8.05 1787.66 1054.87
#7  1771.56 177.15 17.71  885.78 177.15  88.57  8.85 1966.42 1160.35
#8  1948.71 194.87 19.48  974.35 194.87  97.43  9.74 2163.06 1276.39
#9  2143.58 214.35 21.43 1071.79 214.35 107.17 10.71 2379.36 1404.02
#10 2357.94 235.79 23.57 1178.97 235.79 117.89 11.78 2617.30 1544.43
荀振国
2023-03-14

我希望这是你正在寻找的:

library(dplyr)

gl %>%
  rowwise() %>%
  mutate(C1 = sum(c_across(starts_with("X40"))),
         C2 = sum(c_across(starts_with("X50"))))

# A tibble: 10 x 9
# Rowwise: 
   X4010 X4020 X4030 X5010 X5020 X5030 X5040    C1    C2
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1 1000   100   10    500   100   50    5    1110   655 
 2 1100   110   11    550   110   55    5.5  1221   720.
 3 1210   121   12.1  605   121   60.5  6.05 1343.  793.
 4 1331   133.  13.3  666.  133.  66.6  6.65 1477.  872.
 5 1464.  146.  14.6  732.  146.  73.2  7.32 1625.  959.
 6 1611.  161.  16.1  805.  161.  80.5  8.05 1788. 1055.
 7 1772.  177.  17.7  886.  177.  88.6  8.85 1966. 1160.
 8 1949.  195.  19.5  974.  195.  97.4  9.74 2163. 1276.
 9 2144.  214.  21.4 1072.  214. 107.  10.7  2379. 1404.
10 2358.  236.  23.6 1179.  236. 118.  11.8  2617. 1544.
 类似资料:
  • 操作步骤: 菜单栏 —> Edit -- > Column Selection Mode (列选择模式) 快捷键: Mac: Shift + Command + 8 Windows/Linux: Alt + Shift + Insert

  • 范围选择器(rangeSelector)是图表中用于选择数据范围的工具,它提供了预配置的时间选择按钮,包括 1天,1周,1个月等,同时也提供时间输入框用于手动指定时间范围。 时间选择按钮 通过 rangeSelector.buttons 可以指定时间选择按钮,默认是 buttons: [{ type: 'month', count: 1, text: '1m' }, {

  • 问题内容: 是否可以为查询的IN部分定义一个范围,像这样 代替 问题答案: 您不能,但可以使用 请注意,这是包含性内容,并且将包含ID为10和15的项。 如果不想包含,则必须退回到使用and 运算符。

  • 问题内容: 如何选择以“ A”开头的名称直到以“ D”开头的名称的行?并按字母顺序对它们进行排序?就像和的组合? 样品表: 样本输出: 名称以“ Cr”开头,直到名称以“ D”开头 样本输出: 问题答案: 从最多选择名称,但不包括: 由于这是一个简单的比较,因此如果该字段有一个索引,则可以使用索引。

  • 问题内容: 我必须阅读一些文件,其中一些文件采用Excel格式,有些文件采用CSV格式。一些文件具有数百列。 有没有一种方法可以选择多个列范围而不指定所有列名或位置?例如,选择第1 -10、15、17和50-100列: 从Excel文件和CSV文件创建数据框时以及创建数据框框程序后,我都需要知道如何执行此操作。 问题答案: 采用 所以你可以做

  • 在本章中,我们将介绍文档中的选择以及在表单字段(如 <input>)中的选择。 JavaScript 可以获取现有选择,选择/取消全部或部分选择,从文档中删除所选部分,将其包装到一个标签(tag)中,等。 你可以在本文最后的“总结”部分中找到使用方法。但是,如果你阅读整篇内容,将会有更多收获。底层的(underlying)Range 和 Selection 对象很容易掌握,因此,你不需要任何诀窍便