r - 如何根据数据框名称中的单个字符在数据框中添加新列?

标签 r list dataframe

我正在尝试根据数据框名称在数据框中添加新列。

所以我有这个名为 df_list 的数据帧列表,在这个列表中是名为

的数据帧

(1.3.A), (2.3.A), (1.5.A), (2.5.A), (1.3.B), (2.3.B), (1.5.B)

这些字母和数字中的每一个在数据中都很重要。例如,名称以“1”开头的所有数据框都来自实验的试验 1,而以 A 结尾的数据框来自 A 组。

有人可以建议我如何在所有这些数据框中添加一个新列,其值等于数据框名称中的一个字符吗?

预期的输出是这样的

dataframe (1.3.A)

Person       Height        Weight       Trial      Day      Group
Alex           175           75           1         3          A    
Gerard         180           85           1         3          A
Clyde          179           79           1         3          A

dataframe (2.2.A)
Person       Height        Weight       Trial      Day       Group
Missy           175           75           2         2          A    
Britany         180           85           2         2          A
Sussie          179           79           2         2          A
 

dataframe (1.1.B)
Person       Height        Weight       Trial      Day       Group
Luke           175           75           1         1          B    
Alex           180           85           1         1          B
Haley          179           79           1         1          B

目前,所有数据框都有“Person”、“Height”和“Weight”列,我想添加“Trial”、“Day”和“Group”列。

我希望有人能帮我解决这个问题。抱歉,我只是 R 的初学者。 我在考虑可能使用 ifelse()names() 然后 map() 它到整个数据帧列表但无法弄清楚如何.谢谢

最佳答案

您可以使用 dplyr 中的 bind_rows() 并与 tidyr 分开:

library(dplyr)
library(tidyr)
df_list %>% 
  bind_rows(.id = "code") %>% 
  mutate(code = str_remove_all(code, "[(|)]")) %>% 
  separate(code,
           into = c("Trial", "Day","Group"),
           remove = FALSE
  )

# A tibble: 9 x 7
  code  Trial Day   Group Person  Height Weight
  <chr> <chr> <chr> <chr> <chr>    <int>  <int>
1 1.3.A 1     3     A     Alex       175     75
2 1.3.A 1     3     A     Gerard     180     85
3 1.3.A 1     3     A     Clyde      179     79
4 2.2.A 2     2     A     Missy      175     75
5 2.2.A 2     2     A     Britany    180     85
6 2.2.A 2     2     A     Sussie     179     79
7 1.1.B 1     1     B     Luke       175     75
8 1.1.B 1     1     B     Alex       180     85
9 1.1.B 1     1     B     Haley      179     79

以防万一您不熟悉 tidy 语法,请将 %>% 读作“an then”。所以上面的调用可以解释为:take df_list AND THEN bind_rows() AND THEN separate()。更准确地说,

  • bind_rows() 按行将数据帧绑定(bind)在一起,例如将一帧追加到另一帧之后。您可以绑定(bind)两个帧,例如 bind_rows(df1, df2),但是这里我们有一个帧列表 df_list,因此它将把这个列表中的所有数据帧绑定(bind)到一个数据框。

  • 参数 .id 根据列表中每个数据帧的名称创建一个新列,新列名为 code

  • mutate() 步骤中删除了围绕新创建的列 code 的括号。

  • 不过,code 列是短暂的,因为 code 被分成三列,separate(code, into = c("Trial ", "Day","Group"))。由于 df_list 中每个数据框的名称看起来都很好,因此您无需指定拆分正则表达式,即 sep = "[^[:alnum:]]+ " 默认情况下。如果此正则表达式不适用于所有帧,您可能必须相应地进行调整。如果不需要 code 列,只需将参数 remove 设置为 TRUE,或者完全删除参数,因为 remove = TRUE 是默认选项。

替代方案

这会将所有数据框绑定(bind)在一起。如果您希望将它们分开,您可以使用 purrr 的 imap():

purrr::imap(df_list,
            ~mutate(.x, code = .y) %>% 
              separate(code, into = c("Trial", "Day", "Group"))) 
#> $`1.3.A`
#> # A tibble: 3 x 6
#>   Person Height Weight Trial Day   Group
#>   <chr>   <int>  <int> <chr> <chr> <chr>
#> 1 Alex      175     75 1     3     A    
#> 2 Gerard    180     85 1     3     A    
#> 3 Clyde     179     79 1     3     A    
#> 
#> $`2.2.A`
#> # A tibble: 3 x 6
#>   Person  Height Weight Trial Day   Group
#>   <chr>    <int>  <int> <chr> <chr> <chr>
#> 1 Missy      175     75 2     2     A    
#> 2 Britany    180     85 2     2     A    
#> 3 Sussie     179     79 2     2     A    
#> 
#> $`1.1.B`
#> # A tibble: 3 x 6
#>   Person Height Weight Trial Day   Group
#>   <chr>   <int>  <int> <chr> <chr> <chr>
#> 1 Luke      175     75 1     1     B    
#> 2 Alex      180     85 1     1     B    
#> 3 Haley     179     79 1     1     B

数据

编辑:在名称上添加括号。

df_list <- list(
  `(1.3.A)` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,
      "Alex",    175L,     75L,
      "Gerard",    180L,     85L,
      "Clyde",    179L,     79L
    ),
  `(2.2.A)` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,
      "Missy",    175L,     75L,
      "Britany",    180L,     85L,
      "Sussie",    179L,     79L
    ), 
  `(1.1.B)` = 
    tibble::tribble(
      ~Person, ~Height, ~Weight,
      "Luke",    175L,     75L,
      "Alex",    180L,     85L,
      "Haley",    179L,     79L
    )
)

关于r - 如何根据数据框名称中的单个字符在数据框中添加新列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68833924/

相关文章:

r - 机器学习中具有 10 倍交叉验证的代码

R Markdown 中的 rChart 不呈现

python - 从另一个列表中的对应值中减去一个列表中的值

list - ps 列自动宽度

php - 列表元素的识别 - PHP

python - python for循环中的count函数

bash - 如何确保在 Ubuntu 中安装 JAGS 和 rjags 的兼容版本?

r - 识别并计算法术(每组中的特殊事件)

r - 在 R 中逐行合并多个 data.frame

debugging - 在 R 中运行和调试脚本和函数