如何基于与R中其他几列的行值匹配来填充列的值

如何基于与R中其他几列的行值匹配来填充列的值,r,R,数据如下所示 time <- c('Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000', 'Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000', 'Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000') A <- c('20

数据如下所示

 time <- c('Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000',
          'Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000', 'Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000')
A <- c('20.79','NA','NA','NA','21.8','NA','NA')  
B <- c('NA','97.017','94.321','85.014','NA','87.1','67.1')
C <- c('NA','C1','C2','C3','NA','C1','C2')
D <- c('L1','L1','L1','L1','L2','L2','L2')
C1 <- c('NA','NA','NA','NA','NA','NA','NA')
C2 <- c('NA','NA','NA','NA','NA','NA','NA')
C3 <- c('NA','NA','NA','NA','NA','NA','NA')
df <- data.frame(time,A,B,C,D,C1,C2,C3)
如何在一行中获取上述格式的数据,因为所有行的time和D列都是相同的

提前谢谢

您可以使用dplyr::gather将B重新塑造为C1、C2、C3,然后使用dplyr::将其与其他列连接起来,假设有一个唯一的日期/时间

library(dplyr)
library(tidyr)

df %>%
  select(time, A, B, C, D) %>%
  filter(!is.na(A)) %>%
  left_join(
    df %>%
      select(time, C, B, D) %>%
      spread(C, B) %>%
      select(-`<NA>`),
    by = c("time", "D")
  )

#                         time     A  B    C  D     C1     C2     C3
# 1 Nov 1st 2014, 17:36:50.000 20.79 NA <NA> L1 97.017 94.321 85.014
# 2 Nov 1st 2014, 17:37:50.000 21.80 NA <NA> L2 87.100 67.100 47.300
数据 循序渐进 如果我理解正确,OP的数据集实际上由两个混合的数据集组成:

df
需要分开的:

library(data.table)
df1 <- setDT(df)[A != "NA", .(time, A, D)]
df1

标识行的唯一子集的关键列是time和D。列C1、C2和C3将在下一步创建时删除

第二个数据集将从长格式改为宽格式:

wide <- dcast(df2, time + D ~ C, value.var = "B")
wide
数据 由OP提供,NA值以字符串形式给出

time <- c('Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000',
          'Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000', 'Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000')
A <- c('20.79','NA','NA','NA','21.8','NA','NA')  
B <- c('NA','97.017','94.321','85.014','NA','87.1','67.1')
C <- c('NA','C1','C2','C3','NA','C1','C2')
D <- c('L1','L1','L1','L1','L2','L2','L2')
C1 <- c('NA','NA','NA','NA','NA','NA','NA')
C2 <- c('NA','NA','NA','NA','NA','NA','NA')
C3 <- c('NA','NA','NA','NA','NA','NA','NA')
df <- data.frame(time,A,B,C,D,C1,C2,C3)

请使用dput来显示示例而不是图像,因为我们无法将fro图像复制到测试更新了要测试的代码。谢谢,谢谢你的回复。此处的日期/时间不是唯一的。更新了上面的数据集。只要每组4行的日期/时间都是唯一的,它应该仍然有效。不是每个日期/时间都有一组4行。请提供一个完整/完整的可复制示例,以便我知道您要实现的目标。@Paul,我相信您已经非常接近了。只要考虑时间和D作为关键列。
library(data.table)
df1 <- setDT(df)[A != "NA", .(time, A, D)]
df1
                         time     A  D
1: Nov 1st 2014, 17:36:50.000 20.79 L1
2: Nov 1st 2014, 17:37:50.000  21.8 L2
df2 <- df[A == "NA", .(time, B, C, D)]
df2
                         time      B  C  D
1: Nov 1st 2014, 17:36:50.000 97.017 C1 L1
2: Nov 1st 2014, 17:36:50.000 94.321 C2 L1
3: Nov 1st 2014, 17:36:50.000 85.014 C3 L1
4: Nov 1st 2014, 17:37:50.000   87.1 C1 L2
5: Nov 1st 2014, 17:37:50.000   67.1 C2 L2
wide <- dcast(df2, time + D ~ C, value.var = "B")
wide
                         time  D     C1     C2     C3
1: Nov 1st 2014, 17:36:50.000 L1 97.017 94.321 85.014
2: Nov 1st 2014, 17:37:50.000 L2   87.1   67.1   <NA>
df1[wide, on = .(time, D)]
                         time     A  D     C1     C2     C3
1: Nov 1st 2014, 17:36:50.000 20.79 L1 97.017 94.321 85.014
2: Nov 1st 2014, 17:37:50.000  21.8 L2   87.1   67.1   <NA>
library(data.table)
setDT(df)[, (paste0("C", 1:3)) := NULL]
df[A != "NA"][dcast(df[C != "NA"], time + D ~ C, value.var = "B"), on = .(time, D)]
                         time     A  B  C  D     C1     C2     C3
1: Nov 1st 2014, 17:36:50.000 20.79 NA NA L1 97.017 94.321 85.014
2: Nov 1st 2014, 17:37:50.000  21.8 NA NA L2   87.1   67.1   <NA>
time <- c('Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000',
          'Nov 1st 2014, 17:36:50.000','Nov 1st 2014, 17:36:50.000', 'Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000','Nov 1st 2014, 17:37:50.000')
A <- c('20.79','NA','NA','NA','21.8','NA','NA')  
B <- c('NA','97.017','94.321','85.014','NA','87.1','67.1')
C <- c('NA','C1','C2','C3','NA','C1','C2')
D <- c('L1','L1','L1','L1','L2','L2','L2')
C1 <- c('NA','NA','NA','NA','NA','NA','NA')
C2 <- c('NA','NA','NA','NA','NA','NA','NA')
C3 <- c('NA','NA','NA','NA','NA','NA','NA')
df <- data.frame(time,A,B,C,D,C1,C2,C3)