首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R滞后变量与Skip值

R滞后变量与Skip值
EN

Stack Overflow用户
提问于 2022-11-23 20:10:50
回答 2查看 32关注 0票数 1
代码语言:javascript
运行
复制
DATA = data.frame(STUDENT = c(1,1,1,2,2,2,3,3,4,4),
                  SCORE = c(6,4,8,10,9,0,2,3,3,7),
                  CLASS = c('A', 'B', 'C', 'A', 'B', 'C', 'B', 'C', 'A', 'B'),
                  WANT = c(NA, NA, 2, NA, NA, -10, NA, NA, NA, NA))

我有数据,并希望创建“希望”,它是通过以下方法计算的:

对于每个学生,找到分数等于分数的分数(类= C) -分数(类= A)

代码语言:javascript
运行
复制
EX: SCORE(STUDENT = 1, CLASS = C) - SCORE(STUDENT = 1, CLASS = A) = 8-6=2
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-11-23 20:13:01

假设每个‘学生’最多有一个'C‘和'A’‘CLASS’,只需将CLASS值为'C‘、'A’的‘分数’子集,通过将所有其他位置按‘学生’分组后,只将值分配到类为'C‘的位置。

代码语言:javascript
运行
复制
library(dplyr)
DATA <- DATA %>%
   group_by(STUDENT) %>% 
   mutate(WANT2 = (SCORE[CLASS == 'C'][1] - SCORE[CLASS == 'A'][1]) * 
       NA^(CLASS != "C")) %>%
   ungroup

-output

代码语言:javascript
运行
复制
# A tibble: 10 × 5
   STUDENT SCORE CLASS  WANT WANT2
     <dbl> <dbl> <chr> <dbl> <dbl>
 1       1     6 A        NA    NA
 2       1     4 B        NA    NA
 3       1     8 C         2     2
 4       2    10 A        NA    NA
 5       2     9 B        NA    NA
 6       2     0 C       -10   -10
 7       3     2 B        NA    NA
 8       3     3 C        NA    NA
 9       4     3 A        NA    NA
10       4     7 B        NA    NA
票数 3
EN

Stack Overflow用户

发布于 2022-11-23 20:19:52

这是一种解决方案,先以更广泛的格式组织数据,然后再以更长的格式组织。不管" CLASS“列的顺序如何,这个解决方案都能工作(例如,如果有一个实例中的类顺序是CBA或BCA,而不是os ABC,这个解决方案就能工作)。

解决方案

代码语言:javascript
运行
复制
library(dplyr)
library(tidyr)

wider <- DATA %>% select(-WANT) %>% 
  pivot_wider( names_from = "CLASS", values_from = "SCORE") %>% 
  rowwise() %>% 
  mutate(WANT = C-A) %>% 
  ungroup()

输出wider

代码语言:javascript
运行
复制
# A tibble: 4 × 5
  STUDENT     A     B     C  WANT
    <dbl> <dbl> <dbl> <dbl> <dbl>
1       1     6     4     8     2
2       2    10     9     0   -10
3       3    NA     2     3    NA
4       4     3     7    NA    NA

如果您真的想要像您的输出示例一样,那么我们可以通过这样的方式重新组织更广泛的数据:

wider重组为长格式

代码语言:javascript
运行
复制
wider %>% 
  pivot_longer(A:C, values_to = "SCORE", names_to = "CLASS") %>% 
  relocate(WANT, .after = SCORE) %>% 
  mutate(WANT = if_else(CLASS == "C", WANT, NA_real_))

最终输出

代码语言:javascript
运行
复制
# A tibble: 12 × 4
   STUDENT CLASS SCORE  WANT
     <dbl> <chr> <dbl> <dbl>
 1       1 A         6    NA
 2       1 B         4    NA
 3       1 C         8     2
 4       2 A        10    NA
 5       2 B         9    NA
 6       2 C         0   -10
 7       3 A        NA    NA
 8       3 B         2    NA
 9       3 C         3    NA
10       4 A         3    NA
11       4 B         7    NA
12       4 C        NA    NA
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74552471

复制
相关文章

相似问题

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