3

我有一个人类手的数据集,目前一个人被定义为一个单一的观察。我想重塑数据框以将手作为个人观察。我尝试了一些带有“dplyr”包和“gather”功能的东西,但根本没有成功。

因此,从这里开始,每个人都在一行:

id Gender Age   Present_R    Present_L    Dominant
1    F     2      TRUE         TRUE          R
2    F     5      TRUE         FALSE         L
3    M     8      FALSE        FALSE         R

对此,每只手都在一行:

id Gender Age   Hand    Present  Dominant
1    F     2     R       TRUE     TRUE
2    F     2     L       TRUE     FALSE
3    F     5     R       TRUE     FALSE
4    F     5     L       FALSE    TRUE
5    M     8     R       FALSE    TRUE
6    M     8     L       FALSE    FALSE

请注意,手牌优势变得合乎逻辑。

4

2 回答 2

5

我们可以通过'id'gather进入'long'格式,然后通过'Present'列创建'Dominant',通过删除'Hand'列的子字符串来创建'Hand'arrangeunlist

library(tidyverse)
gather(df1, Hand, Present, Present_R:Present_L) %>%
   arrange(id) %>%
   mutate(Dominant = unlist(df1[c("Present_L", "Present_R")]),
          id = row_number(),
          Hand = str_remove(Hand, ".*_"))
#   id Gender Age Dominant Hand Present
#1  1      F   2     TRUE    R    TRUE
#2  2      F   2    FALSE    L    TRUE
#3  3      F   5    FALSE    R    TRUE
#4  4      F   5     TRUE    L   FALSE
#5  5      M   8     TRUE    R   FALSE
#6  6      M   8    FALSE    L   FALSE

根据 OP 的评论,我们似乎需要将“Dominant”与“Hand”进行比较

gather(df1, Hand, Present, Present_R:Present_L) %>%
    arrange(id) %>% 
    mutate(id = row_number(),
           Hand = str_remove(Hand, ".*_"),
           Dominant = Dominant == Hand)
#   id Gender Age Dominant Hand Present
#1  1      F   2     TRUE    R    TRUE
#2  2      F   2    FALSE    L    TRUE
#3  3      F   5    FALSE    R    TRUE
#4  4      F   5     TRUE    L   FALSE
#5  5      M   8     TRUE    R   FALSE
#6  6      M   8    FALSE    L   FALSE
于 2019-01-01T21:21:48.150 回答
0

对于较小的数据框(即,变量很少,无论案例数量如何),“手工编码”可能是最简单的方法:

with(df, data.frame(id = c(id,id), Gender=c(Gender,Gender), Age=c(Age, Age), 
                    Hand = c(rep("R", nrow(df)), rep("L", nrow(df))),
                    Present = c(Present_R, Present_L),
                    Dominant = c(Dominant=="R", Dominant=="L")
                    ))
于 2019-01-01T21:28:02.300 回答