Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
结合具有重复值的行和NAs[不使用tidyverse]_R_Aggregate - Fatal编程技术网

结合具有重复值的行和NAs[不使用tidyverse]

结合具有重复值的行和NAs[不使用tidyverse],r,aggregate,R,Aggregate,我有一个数据帧,每个ID有多行。我想合并这些行,为每个ID获得一行,并合并相应的值,这些值可以是数字或NA(我想忽略) 我不确定我是否可以在这里使用aggregate();通常,我希望将列(V1-V4)中的每个ID值设置为一个数字,如果有一个值不是NA 输入: ID V1 V2 V3 V4 1 04C 6 NA NA 9 2 04C NA 9 NA 9 3 0F0 NA 5 NA 4 4 0F0 NA NA 7 4 5 0F0 NA 5 7 NA 6 16

我有一个数据帧,每个ID有多行。我想合并这些行,为每个ID获得一行,并合并相应的值,这些值可以是
数字
NA
(我想忽略)

我不确定我是否可以在这里使用aggregate();通常,我希望将列(V1-V4)中的每个ID值设置为一个数字,如果有一个值不是
NA

输入:

    ID V1 V2 V3 V4
1  04C  6 NA NA  9
2  04C NA  9 NA  9
3  0F0 NA  5 NA  4
4  0F0 NA NA  7  4
5  0F0 NA  5  7 NA
6  167  8 NA NA NA
7  167  8 10  5 NA
8  167  8 10 NA NA
9  167  8 NA  5 NA
10 2D7  3  3 NA  1
输出:

   ID V1 V2 V3 V4
1 04C  6  9 NA  9
2 0F0 NA  5  7  4
3 167  8 10  5 NA
4 2D7  3  3 NA  1
# A tibble: 4 x 5
  ID       V1    V2    V3    V4
  <fct> <int> <int> <int> <int>
1 04C       6     9    NA     9
2 0F0      NA     5     7     4
3 167       8    10     5    NA
4 2D7       3     3    NA     1
我想出了一个解决方案,不幸的是它非常慢,但至少它避免了创建一个tibble

for(i in 2:nrow(df)) {
   row0 <- df[i-1,1]
   row1 <- df[i,1]  
   if (row0==row1) {
      for(j in 2:5) {
         if (is.na(df[i,j])) {
            df[i,j] <- df[i-1,j]
         }
      }
      df[i-1,1] <- "NA"
   }
}
dfclean <- subset(df, V0!="NA")
for(2中的i:nrow(df)){

行01
tidyverse
可能性可能是:

df %>%
 gather(var, val, -ID, na.rm = TRUE) %>%
 group_by(ID, var) %>%
 distinct(val) %>%
 spread(var, val)

  ID       V1    V2    V3    V4
  <chr> <int> <int> <int> <int>
1 04C       6     9    NA     9
2 0F0      NA     5     7     4
3 167       8    10     5    NA
4 2D7       3     3    NA     1
df%>%
聚集(var,val,-ID,na.rm=TRUE)%>%
分组依据(ID,var)%>%
不同(val)%>%
价差(var,val)
ID V1 V2 V3 V4
104C 6 9 NA 9
2 0F0 NA 5 7 4
31678105NA
4 2D7 3 NA 1
也可以选择:

library(dplyr)

df %>%
  group_by(ID) %>%
  summarise_all(~ if (any(!is.na(.))) first(na.omit(.)) else NA)
输出:

   ID V1 V2 V3 V4
1 04C  6  9 NA  9
2 0F0 NA  5  7  4
3 167  8 10  5 NA
4 2D7  3  3 NA  1
# A tibble: 4 x 5
  ID       V1    V2    V3    V4
  <fct> <int> <int> <int> <int>
1 04C       6     9    NA     9
2 0F0      NA     5     7     4
3 167       8    10     5    NA
4 2D7       3     3    NA     1
#一个tible:4 x 5
ID V1 V2 V3 V4
104C 6 9 NA 9
2 0F0 NA 5 7 4
31678105NA
4 2D7 3 NA 1

tidyverse
非常有趣,谢谢。我当然必须先安装它,然后再安装
bindrcpp
。效果很好,但如何将输出保存到新的数据帧?
df_new%…
重复的