我正试图以与下面的纵向研究示例类似的方式组合两个长度不等的数据集。数据集1只包括每个参与者一次,以及他们第一次每周调查的数据行。数据集2包括所有参与者的所有调查。我正在尝试创建第三个数据集,以解释遗漏的每周调查。例如,如果参与者2错过了1月17日的调查,它仍然会显示第2周、参与者id和日期,其余列为空白。任何关于如何实现这一点的想法都将不胜感激,因为我对R.非常陌生
#dataframe 1 (many more value cols)
ID date value Weeknumber
1 March 1 8 1
2 Jan 10 9 1
3 April 12 12 1
4 Dec 9 6 1
#Dataframe 2
ID date value
1 March 1 8
1 March 8 3
1 March 15 9
1 March 22 11
1 March 29 5
2 Jan 10 9
2 Jan 24 5
2 Jan 31 12
2 Feb 7 7
3 April 12 12
3 April 19 3
3 April 26 10
3 May 2 6
4 Dec 9 6
4 Dec 30 7
4 Jan 6 11
#Desired output:
ID Date Value Week number
1 March 1 8 1
1 March 8 3 2
1 March 15 9 3
1 March 22 11 4
1 March 29 5 5
2 Jan 10 9 1
2 Jan 17 2
2 Jan 24 5 3
2 Jan 31 12 4
2 Feb 7 7 5
3 April 12 12 1
3 April 19 3 2
3 April 26 10 3
3 May 2 6 4
3 May 9 5
4 Dec 9 6 1
4 Dec 16 2
4 Dec 23 3
4 Dec 30 7 4
4 Jan 6 11 5
这里是考虑使用tidyverse
的另一种方法。
首先,考虑把几年的约会时间包括在内。如果你把年份包括在内,那么你就可以更准确地计算闰年来确定遗漏周的日期。当你提到对R非常陌生时,如果想让我添加转换日期的详细信息,请告诉我。
接下来,从第一个数据帧df1
中选择ID
和date
,可以选择group_by
ID
,在每个ID
中执行后续过程。使用mutate
和map
,可以添加从原始date
开始的连续5周的行。
之后,您可以将另一个数据帧df2
与left_join
合并。缺失的几周将有NA
代替value
。最后,我们可以将每个ID
中的row_number()
添加为Weeknumber
。
在示例日期中注意到的另一个最后问题是,4月26日和5月2日只相隔6天。如果不是整整一周的话,加入会错过这个。如果日期不是正好相隔一周,可能会有其他方法。
library(tidyverse)
df1[,c("ID", "date")] %>%
group_by(ID) %>%
mutate(date = map(date, seq.Date, length.out = 5, by = "week")) %>%
unnest(cols = c(date)) %>%
left_join(df2, by = c("ID", "date")) %>%
mutate(Weeknumber = row_number())
输出
ID date value Weeknumber
<dbl> <date> <dbl> <int>
1 1 2020-03-01 8 1
2 1 2020-03-08 3 2
3 1 2020-03-15 9 3
4 1 2020-03-22 11 4
5 1 2020-03-29 5 5
6 2 2020-01-10 9 1
7 2 2020-01-17 NA 2
8 2 2020-01-24 5 3
9 2 2020-01-31 12 4
10 2 2020-02-07 7 5
11 3 2020-04-12 12 1
12 3 2020-04-19 3 2
13 3 2020-04-26 10 3
14 3 2020-05-03 NA 4
15 3 2020-05-10 NA 5
16 4 2020-12-09 6 1
17 4 2020-12-16 NA 2
18 4 2020-12-23 NA 3
19 4 2020-12-30 7 4
20 4 2021-01-06 11 5
一种可能的方法是使用函数"匹配";。但是,您需要一个适当的映射,将一个值映射到另一个值。让我们举个例子。我在一列上生成一个随机字母和另一列上的数字的数据帧:
adf=data.frame(a_lett=sample(letters, 10), a_num=1:10)
a_lett a_num
1 o 1
2 b 2
3 t 3
4 v 4
5 a 5
6 x 6
7 u 7
8 e 8
9 h 9
10 c 10
现在我想使用match函数添加另一列。所以我生成了我的";map";,这是另一个数据帧,说明哪些是wovels。
adf2=data.frame(voc_letter=c("a","e", "i", "o", "u"), is_vocal=paste0("vocal", 1:5))
voc_letter is_vocal
1 a vocal1
2 e vocal2
3 i vocal3
4 o vocal4
5 u vocal5
请记住,这张地图并不完整,事实上,它并没有绘制辅音。
然后我可以使用";匹配"匹配";为第一个参数的每个元素返回第二个参数中的位置。因此,我们可以使用这些位置来调用adf2$is_vocal列中的元素,并将其分配给adf中的一个新列。
adf$is_vocal=adf2$is_vocal[match(adf$a_lett, adf2$voc_letter)]
a_lett a_num is_vocal
1 o 1 vocal4
2 b 2 <NA>
3 t 3 <NA>
4 v 4 <NA>
5 a 5 vocal1
6 x 6 <NA>
7 u 7 vocal5
8 e 8 vocal2
9 h 9 <NA>
10 c 10 <NA>
许多";NA";是由于辅音和adf2数据帧之间没有对应关系。