[英]How can I add a new column and use an existing column in a data frame in R?
[英]How I can add a new column to this data in R
我想使用此示例數據生成一個新列:
df<-read.table (text=" id a1 a2 a3 a4 a5 a6
1 5 6 5 6 3 6
2 3 4 2 6 2 4",
header=TRUE)
我想添加一個新列來獲取以下數據
id a m score
1 a1 m1 5
1 a2 m1 6
1 a3 m1 5
1 a4 m2 6
1 a5 m2 3
1 a6 m2 6
2 a1 m1 3
2 a2 m1 4
2 a3 m1 2
2 a4 m2 6
2 a5 m2 2
2 a6 m2 4
邏輯是 a1,a2,a3 =m1, a4,a5,a6=m2。 我想生成列 m
我使用了這些代碼:
pivot_longer(df, a1:a6, names_to = "a", values_to = "score")
我已經搜索過,但我沒有找到解決方案提前感謝您的幫助。
pivot_longer(df, -id, names_to = "a", values_to = "score") %>%
mutate(m = case_when(
a %in% c("a1","a2","a3") ~ "m1",
a %in% c("a4","a5","a6") ~ "m2",
TRUE ~ "unk")
)
# # A tibble: 12 x 4
# id a score m
# <int> <chr> <int> <chr>
# 1 1 a1 5 m1
# 2 1 a2 6 m1
# 3 1 a3 5 m1
# 4 1 a4 6 m2
# 5 1 a5 3 m2
# 6 1 a6 6 m2
# 7 2 a1 3 m1
# 8 2 a2 4 m1
# 9 2 a3 2 m1
# 10 2 a4 6 m2
# 11 2 a5 2 m2
# 12 2 a6 4 m2
根據您希望如何維護從m
到a
的映射,這是case_when
的替代方法:
groups <- tribble(
~m, ~a,
"m1", "a1",
"m1", "a2",
"m1", "a3",
"m2", "a4",
"m2", "a5",
"m2", "a6"
)
pivot_longer(df, -id, names_to = "a", values_to = "score") %>%
left_join(groups, by = "a")
# # A tibble: 12 x 4
# id a score m
# <int> <chr> <int> <chr>
# 1 1 a1 5 m1
# 2 1 a2 6 m1
# 3 1 a3 5 m1
# 4 1 a4 6 m2
# 5 1 a5 3 m2
# 6 1 a6 6 m2
# 7 2 a1 3 m1
# 8 2 a2 4 m1
# 9 2 a3 2 m1
# 10 2 a4 6 m2
# 11 2 a5 2 m2
# 12 2 a6 4 m2
我發現自己維護groups
框架通常非常簡單:它可以在自己的 CSV 中,因此可以通過您喜歡的任何方式進行編輯/維護(包括 excel/libreoffice/calc)。
[此答案使用已退休的 function - 我留下答案以提醒gather
和spread
已過時 - 請考慮使用pivot
代替答案]
我正在使用dplyr
和tidyr
library(dplyr)
library(tidyr)
df %>%
gather(a, score, a1:a6) %>%
mutate(m = case_when(
a %in% c("a1", "a2", "a3") ~ "m1",
a %in% c("a4", "a5", "a6") ~ "m2"),
TRUE ~ "Unknown") %>%
select(id, a, m, score)
輸出
id a m score
1 1 a1 m1 5
2 2 a1 m1 3
3 1 a2 m1 6
4 2 a2 m1 4
5 1 a3 m1 5
6 2 a3 m1 2
7 1 a4 m2 6
8 2 a4 m2 6
9 1 a5 m2 3
10 2 a5 m2 2
11 1 a6 m2 6
12 2 a6 m2 4
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.