【问题标题】:How to combine rows with specific names in R如何在R中组合具有特定名称的行
【发布时间】:2019-04-15 17:36:26
【问题描述】:

我有一个数据框,其中包含循环中的一些重复行:

                     v1     v2     v3    v4
  Number              1     2      3     5
  Index               0     0      0     0
  Number.1            1     2      3     5
  Index.1             0     0      0     0
  Number.2            1     2      3     5
  Index.2             0     0      0     0
  Number.3            1     2      3     5
  Index.3             0     0      0     0
  Number.4            1     2      3     5
  Index.4             0     0      0     0
  Number.5            1     2      3     5
  Index.5             0     0      0     0

我想将所有具有“数字”的行作为单行值附加到一个不同的列中

                      v1     v2     v3   v4    v5     v6     v7    v8
  Number              1     2      3     5      1     2      3     5   etc

我还没有找到任何简单的方法来做到这一点,虽然它看起来很容易。 我像这样尝试使用 dplyr 没有成功:

  df[,rownames(df)%in%(grep("Number*", rownames(df))]

【问题讨论】:

  • 我认为你需要在c(t(df[rownames(df)%in%(grep("Number*", rownames(df)),]))之后的,

标签: r merge dplyr


【解决方案1】:

这是一个相当复杂的 dplyr 解决方案 - 在线 cmets 中的解释。

library(tidyverse)

df2 <- df %>%
  mutate(row_name = rownames(.)) %>% # Add a new column with the row names
  filter(grepl("Number", row_name)) %>% # filter against a match for 'Number'
  select(-row_name) %>% # Get rid of that column
  t() %>% # Transpose
  map(unlist, use.names = F) %>% # Flatten
  as.data.frame() %>% # Convert to a df so we can change the row name later
  `colnames<-`(paste0("v", seq(1:ncol(.)))) %>%  # Add colnames to your format
  `rownames<-`("Number") # Add the row name

结果:

       v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18
Number  1  2  3  1  2  3  1  2  3   1   2   3   1   2   3   1   2   3

【讨论】:

    【解决方案2】:

    我们采用转置和连接 (c) 得到 vector

    i1 <-  rownames(df)%in%(grep("Number(\\.\\d)*", rownames(df), value = TRUE))
    v1 <- c(t(df[i1, ]))
    

    注意:grep 返回索引,因此无需再次执行%in% 以匹配行名

    i2 <- grep("Number(\\.\\d)*", rownames(df))
    

    子集就足够了

    v2 <- c(t(df[i2, ]))
    

    最好将其作为向量而不是作为 data.frame。如果我们真的需要一个包含尽可能多列的单行 data.frame

    as.data.frame.list(v1)
    

    注意 2:稍微更改了模式以匹配 . 后跟数字(如果有)。在 OP 的代码中,它会检查 Number*,即 0 个或多个 'r'(尽管它在数据中有效)

    【讨论】:

    • 这就像一个魅力!我坚持这样做会更容易,但它可以按预期工作
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    • 2023-04-07
    • 2020-12-08
    • 2023-02-23
    • 2022-01-02
    • 1970-01-01
    • 2021-10-01
    相关资源
    最近更新 更多