首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何选择块的第一行来定义条件并重新构造每个块中的后续行?

如何选择块的第一行来定义条件并重新构造每个块中的后续行?
EN

Stack Overflow用户
提问于 2021-07-16 16:14:03
回答 5查看 38关注 0票数 2

我有一个数据框,看起来像这样:

代码语言:javascript
复制
trialcode response block
AM2A3     0        1
Empathy   1        1
ToM       4        1
Transfer  2.5      1
AM2D1     0        2
Empathy   4        2
ToM       2        2
Transfer  6        2
AM4M1     0        3
Empathy   6        3
ToM       6        3
Transfer  10       3

在每个块中,第一行定义试验条件,后面三行是我的因变量。我想把它重新组织成这样:

代码语言:javascript
复制
Empathy ToM Transfer condition block
1       4   2.5      AM2A3     1
4       2   6        AM2D1     2
6       6   10       AM4M1     3

有人能帮上忙吗?谢谢!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2021-07-16 16:29:50

可选解决方案:

代码语言:javascript
复制
library(data.table)
dt[,.(Empathy = .SD[trialcode == "Empathy", response],
      Tom = .SD[trialcode == "ToM", response], 
      Transfer = .SD[trialcode == "Transfer", response],
      condition = head(trialcode,1)),
    by = block]

数据:

代码语言:javascript
复制
dt <- fread("
trialcode response block
AM2A3     0        1
Empathy   1        1
ToM       4        1
Transfer  2.5      1
AM2D1     0        2
Empathy   4        2
ToM       2        2
Transfer  6        2
AM4M1     0        3
Empathy   6        3
ToM       6        3
Transfer  10       3
")
票数 0
EN

Stack Overflow用户

发布于 2021-07-16 16:24:38

库(data.table)

代码语言:javascript
复制
DT <- setDT(mydata)
# wrangling before casting
DT[, condition := trialcode[1], by = .(block)]
# cast 2nd - nth row of each group
dcast(DT[, .SD[2:.N], by = .(condition)], 
      block + condition ~ trialcode, value.var = "response")
#    block condition Empathy ToM Transfer
# 1:     1     AM2A3       1   4      2.5
# 2:     2     AM2D1       4   2      6.0
# 3:     3     AM4M1       6   6     10.0
票数 2
EN

Stack Overflow用户

发布于 2021-07-16 16:19:39

欢迎加入SO!这应该是可行的:

代码语言:javascript
复制
library(tidyverse)
    output <- data %>% 
  mutate(response = ifelse(response == 0, trialcode, response)) %>% 
  mutate(trialcode = ifelse(str_starts(trialcode,"AM"), "condition", trialcode)) %>% 
  pivot_wider(names_from = trialcode, values_from = response) %>% 
  relocate(Empathy, ToM, Transfer, condition, block)

使用的数据:

代码语言:javascript
复制
data <- data.frame(trialcode = c("AM2A3","Empathy","ToM","Transfer","AM2D1","Empathy","ToM","Transfer"),
                 response = c(0,1,4,2.5,0,4,2,6),
                 block = c(1,1,1,1,2,2,2,2))

输出:

代码语言:javascript
复制
Empathy ToM   Transfer condition block
  <chr>   <chr> <chr>    <chr>     <dbl>
1 1       4     2.5      AM2A3         1
2 4       2     6        AM2D1         2
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68405721

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档