R 如何根据其他两列的值将单元格的值复制到其他行?

R 如何根据其他两列的值将单元格的值复制到其他行?,r,R,我有一个如下所示的数据框: zz = "Sub Item Answer 1 A 1 NA 2 A 1 0 3 A 2 NA 4 A 2 1 5 B 1 NA 6 B 1 1 7 B 2 NA 8 B 2 0" Data = read.table(text=zz, header = TRUE) zz2 = "Sub Item An

我有一个如下所示的数据框:

zz = "Sub Item Answer
1      A   1    NA
2      A   1    0
3      A   2    NA
4      A   2    1
5      B   1    NA
6      B   1    1
7      B   2    NA
8      B   2    0"    
Data = read.table(text=zz, header = TRUE)
zz2 = "Sub Item Answer
1      A   1    0
2      A   1    0
3      A   2    1
4      A   2    1
5      B   1    1
6      B   1    1
7      B   2    0
8      B   2    0"
Data2 = read.table(text=zz2, header = TRUE)
理想的结果是将“答案”(0或1)下的值复制到同一主题和同一项目的NA单元格中。例如,第2行中的answer=0应该复制到第1行中的answer单元格中,而不是复制到其他行中。输出应如下所示:

zz = "Sub Item Answer
1      A   1    NA
2      A   1    0
3      A   2    NA
4      A   2    1
5      B   1    NA
6      B   1    1
7      B   2    NA
8      B   2    0"    
Data = read.table(text=zz, header = TRUE)
zz2 = "Sub Item Answer
1      A   1    0
2      A   1    0
3      A   2    1
4      A   2    1
5      B   1    1
6      B   1    1
7      B   2    0
8      B   2    0"
Data2 = read.table(text=zz2, header = TRUE)
我该怎么做?我注意到之前有一些问题询问如何将一个单元格复制到其他单元格,例如,但它仅基于一列的值。此外,此问题与旨在将最新数值复制到NAs的问题略有不同


谢谢你的回答

您可以使用
zoo::na.locf

library(tidyverse);
library(zoo);
Data %>% group_by(Sub, Item) %>% mutate(Answer = na.locf(Answer));
# A tibble: 8 x 3
## Groups:   Sub, Item [4]
#  Sub    Item Answer
#  <fct> <int>  <int>
#1 A         1      0
#2 A         1      0
#3 A         2      1
#4 A         2      1
#5 B         1      1
#6 B         1      1
#7 B         2      0
#8 B         2      0
库(tidyverse)
数据%>%分组依据(子项)%>%填写(回答,.direction=“up”)
#一个tibble:8x3
#分组:分项[4]
分项答复
1A 10
2 A 10
3 A 2 1
4 A 2 1
5b11
6b11
7B20
8B20

虽然这不是OP的意图,但我想到了这样的情况:一组
子项
组只有
NA
值,或者一组有多个非NA值

处理这种情况的一种方法是,取该组的
max/min
,忽略
max/min
值(如果这些值是
Inf

解决办法可以是:

library(dplyr)
Data %>% group_by(Sub, Item) %>% 
    mutate(Answer = ifelse(max(Answer, na.rm=TRUE)== -Inf, NA, 
                     as.integer(max(Answer, na.rm=TRUE))))

#Result
#  Sub     Item Answer
#  <fctr> <int>  <int>
#1 A          1      0
#2 A          1      0
#3 A          2      1
#4 A          2      1
#5 B          1      1
#6 B          1      1
#7 B          2      0
#8 B          2      0
库(dplyr)
数据%>%分组依据(子项)%>%
变异(答案=ifelse)(最大值(答案,na.rm=TRUE)=-Inf,na,
as.integer(最大值(回答,na.rm=TRUE)))
#结果
#分项答复
#     
#1A 10
#2 A 10
#3 A 2 1
#4 A 2 1
#5b11
#6b11
#7B20
#8B20

可能重复@MauritsEvers这似乎有点不同,因为您指向的链接在最终输出中有NAs,而这个问题要求输出中没有NAs。它们很相似,我同意,但可能已经足够不同了。如果
子项
值为非NA
时有多行,会发生什么?在这种情况下应该复制哪一行?@MKR在我的实际数据中,对于每个子项行组合,只有一行具有非NA值。谢谢@YiwenZhang这两行可能都有
NA
?我的答案与你的答案太接近了,所以我建议一个不需要
zoo
库的替代方案:
Data%>%group\u by(Sub,Item)%%>%mutate(answer=answer[!Is.NA(answer)]
@stevb这是一个好方法!我从没见过这个。谢谢。如果您想将其作为备选方案添加,请随意添加。@steveb Done;-)根据输入数据,每个组的答案可能有超过1个非NA值,在这种情况下,可以选择最大值或某个单一值。