簡體   English   中英

如何在 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   

根據您希望如何維護從ma的映射,這是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 - 我留下答案以提醒gatherspread已過時 - 請考慮使用pivot代替答案]

我正在使用dplyrtidyr

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM