簡體   English   中英

在R中按條件堆疊多列

[英]Stacking multiple columns by condition in R

我有一個數據庫,其中有兩個任務條件的幾個不同的情緒變量,例如:

   ID      Cond1_sad Cond1_anxious Cond1_happy Cond2_sad Cond2_anxious Cond2_happy
1 C_01         1             7           4         1             3           2
2 C_02         3             6           4         4             6           5
3 C_03         8             6           5         3             4           4
4 C_04         4             5           5         6             8           6
5 C_05         6             4           3         2             6           3
6 C_06         1             4           2         8             1           4

我需要根據條件堆疊,但將情緒變量保存在單獨的列中。 例如:

    ID    Condition Sad Anxious Happy
1  C_01         1   1       7     4
2  C_02         1   3       6     4
3  C_03         1   8       6     5
4  C_04         1   4       5     5
5  C_05         1   6       4     3
6  C_06         1   1       4     2
7  C_01         2   1       3     2
8  C_02         2   4       6     5
9  C_03         2   3       4     4
10 C_04         2   6       8     6
11 C_05         2   2       6     3
12 C_06         2   8       1     4

我嘗試了多種方法來堆疊數據(例如,將它們融合),但最終所有變量都堆疊在一起。 有更好的解決方案嗎?

提前謝謝了。

這是在 tidyverse 中執行此操作的一種方法。 這應該比按索引指定列位置更靈活。

library(dplyr)
library(tidyr)
library(janitor)

df %>% 
  pivot_longer(-ID, names_to = c("Condition", "Emotion"),
               values_to = "Value", names_sep = "_", names_prefix = "Cond",
               names_transform = list(Condition = as.integer)) %>% 
  pivot_wider(names_from = "Emotion", values_from = "Value") %>% 
  arrange(Condition, ID) %>% 
  clean_names("title")

# # A tibble: 12 x 5
#    ID    Condition   Sad Anxious Happy
#    <chr>     <int> <int>   <int> <int>
#  1 C_01          1     1       7     4
#  2 C_02          1     3       6     4
#  3 C_03          1     8       6     5
#  4 C_04          1     4       5     5
#  5 C_05          1     6       4     3
#  6 C_06          1     1       4     2
#  7 C_01          2     1       3     2
#  8 C_02          2     4       6     5
#  9 C_03          2     3       4     4
# 10 C_04          2     6       8     6
# 11 C_05          2     2       6     3
# 12 C_06          2     8       1     4

不確定是否有更多條件,在您給定的情況下,這將起作用

library(tibble)

df <- data.frame(ID = c("C_01","C_02","C_03","C_04","C_05","C_06"),
                 Cond1_sad = c(1,3,8,4,6,1),
                 Cond1_anxious = c(7,6,6,5,4,4),
                 Cond1_happy = c(4,4,5,5,3,2),
                 Cond2_sad = c(1,4,3,6,2,8),
                 Cond2_anxious = c(3,6,4,8,6,1),
                 Cond2_happy = c(2,5,4,6,3,4))

df1 <- df[,c(1,2,3,4)]
df2 <- df[,c(1,5,6,7)]

df1 <- add_column(df1, Condition = 1, .after = 1)
df2 <- add_column(df2, Condition = 2, .after = 1)

colnames(df1) <- c("ID", "Condition", "Sad", "Anxious", "Happy")
colnames(df2) <- c("ID", "Condition", "Sad", "Anxious", "Happy")

df3 <- rbind(df1,df2)

df3

> df3
     ID Condition Sad Anxious Happy
1  C_01         1   1       7     4
2  C_02         1   3       6     4
3  C_03         1   8       6     5
4  C_04         1   4       5     5
5  C_05         1   6       4     3
6  C_06         1   1       4     2
7  C_01         2   1       3     2
8  C_02         2   4       6     5
9  C_03         2   3       4     4
10 C_04         2   6       8     6
11 C_05         2   2       6     3
12 C_06         2   8       1     4

這是在base執行此操作的簡單方法。 如果你真的想要,我相信你可以找到一種方法來刪除索引和顯式v.names

reshape(df, direction="long",  varying=list(c(2, 5), c(3, 6), c(4, 7)), 
        v.names=c("Sad", "Anxious", "Happy"), timevar = "Condition",
        times = c(1, 2), idvar = F)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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