假设我有
> df
fu1_date fu1_n_symp fu5_date fu5_n_symp fu7_date fu7_n_symp
1 2012-03-05 1 2014-03-05 NA 2016-03-05 1
2 2013-08-09 1 2015-10-09 2 2017-11-09 NA
3 2019-05-05 1 2020-06-07 2 2021-07-09 2
df
表示一个非常大的 Dataframe ,在这个例子中,我记录了不同随访日期fu_date
的症状数量n_symp
。
我的 Dataframe fu1_
,fu2_
,...,fu20_
中的每一行最多有20个后续。我需要更正我的 Dataframe ,以便如果n_symp
是NA
,则对应的fuX_date
应从as.Date()
转换为NA
。
您可以看到,row 1
在随访5(fu5_n_symp == NA
)中有缺失值,但在FU1或FU7中没有。因此,第1行中的fu5_date
应从2014-03-05
转换为NA
我正在寻找一个解决方案,在dplyr
只。
- 预期输出**
> df
fu1_date fu1_n_symp fu5_date fu5_n_symp fu7_date fu7_n_symp
1 2012-03-05 1 <NA> NA 2016-03-05 1
2 2013-08-09 1 2015-10-09 2 <NA> NA
3 2019-05-05 1 2020-06-07 2 2021-07-09 2
数据类型
df <- structure(list(fu1_date = structure(c(15404, 15926, 18021), class = "Date"),
fu1_n_symp = c(1L, 1L, 1L), fu5_date = structure(c(16134,
16717, 18420), class = "Date"), fu5_n_symp = c(NA, 2L, 2L
), fu7_date = structure(c(16865, 17479, 18817), class = "Date"),
fu7_n_symp = c(1L, NA, 2L)), class = "data.frame", row.names = c(NA, -3L))
2条答案
按热度按时间wj8zmpe11#
使用
pivot_longer()
,您可以指定".value"
tonames_to
以成对堆叠date
和n_symp
。在这种情况下,必须提供names_sep
或names_pattern
之一以指定应如何拆分列名。然后,您可以轻松地将缺少n_symp
的日期替换为NA
。最后,将长数据旋转得更宽以获得原始格式。pivot_wider()
中的names_vary
控制组合结果列名的顺序。mbyulnm02#
更新:@Darren Tsai输入后调整代码:
下面是一种方法,使用透视:
x一个一个一个一个x一个一个二个x