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值,在这种情况下,可以选择最大值或某个单一值。