首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在col.names中根据row.names和条件求和行-- R

在col.names中根据row.names和条件求和行-- R
EN

Stack Overflow用户
提问于 2020-10-28 19:23:47
回答 2查看 148关注 0票数 0
代码语言:javascript
复制
df <- data.frame(row.names = c('1s.u1','1s.u2','2s.u1','2s.u2','6s.u1'),fjri_deu_klcea= c('0','0','0','15','23'),hfue_klcea=c('2','2','0','156','45'),dji_dhi_ghcea_jk=c('456','0','0','15','15'),jdi_jdi_ghcea=c('1','2','3','4','100'),gz7_jfu_dcea_jdi=c('5','6','3','7','56'))

df
      fjri_deu_klcea hfue_klcea dji_dhi_ghcea_jk jdi_jdi_ghcea gz7_jfu_dcea_jdi
1s.u1              0          2              456             1                5
1s.u2              0          2                0             2                6
2s.u1              0          0                0             3                3
2s.u2             15        156               15             4                7
6s.u1             23         45               15           100               56

我想根据列名的cea部分来总结df。因此,具有相同cea部分的所有行都应该求和。df应该如下所示

代码语言:javascript
复制
        klcea      ghcea            dcea
1s.u1      2         457               5
1s.u2      2          2                6
2s.u1      0          3                3
2s.u2      171        19               7
6s.u1      68         115              56

我考虑首先获得一个名为ceacea列,然后根据row.names和相应的cea将其汇总为类似with(df, ave(cea, row.names(df), FUN = sum))的内容

我不知道如何根据字符串中的模式生成新列。我猜grepl是有用的,但我想不出什么办法,我试过df$cea <- df[grepl(colnames(df),'cea'),],这是错的……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-10-28 19:43:43

使用基数R,您可以从名称中提取"cea“部分,并在split.default中使用它将数据帧拆分为多个列,然后我们可以使用rowSums对每个单独的数据帧求和。

代码语言:javascript
复制
sapply(split.default(df, sub('.*_(.*cea).*', '\\1', names(df))), rowSums)

#      dcea ghcea klcea
#1s.u1    5   457     2
#1s.u2    6     2     2
#2s.u1    3     3     0
#2s.u2    7    19   171
#6s.u1   56   115    68

其中sub部件返回:

代码语言:javascript
复制
sub('.*_(.*cea).*', '\\1', names(df))
#[1] "klcea" "klcea" "ghcea" "ghcea" "dcea" 
票数 1
EN

Stack Overflow用户

发布于 2020-10-28 19:48:48

使用dplyr:

代码语言:javascript
复制
> df %>% rowwise() %>% mutate(klcea = sum(c_across(ends_with('klcea'))), 
+                             ghcea = sum(c_across(contains('ghcea'))),
+                             dcea = sum(c_across(contains('dcea')))) %>% 
+                     select(klcea, ghcea, dcea)
# A tibble: 5 x 3
# Rowwise: 
  klcea ghcea  dcea
  <dbl> <dbl> <dbl>
1     2   457     5
2     2     2     6
3     0     3     3
4   171    19     7
5    68   115    56

如果希望保留行名:

代码语言:javascript
复制
> df %>% rownames_to_column('rn') %>% rowwise() %>% mutate(klcea = sum(c_across(ends_with('klcea'))), 
+                             ghcea = sum(c_across(contains('ghcea'))),
+                             dcea = sum(c_across(contains('dcea')))) %>% 
+                     select(klcea, ghcea, dcea, rn) %>% column_to_rownames('rn')
      klcea ghcea dcea
1s.u1     2   457    5
1s.u2     2     2    6
2s.u1     0     3    3
2s.u2   171    19    7
6s.u1    68   115   56
> 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64571832

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档