我正在尝试根据数据框名称在数据框中添加新列。
所以我有这个名为 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/