R:在第一列中按重复项合并行

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了R:在第一列中按重复项合并行相关的知识,希望对你有一定的参考价值。

我在第一列中有一个包含重复值的大型数据集,如下所示:

ID         date      var1   var2
person1    052016    509    1678  
person2    122016    301    NA
person1    072016    NA     45

我希望将ID和最近的值合并为“date”,如果它是NA,则取最后一个值,即它不是NA。输出应该是这样的:

ID         date      var1   var2 
person2    122016    301    NA
person1    072016    509    45

我试过这个,但它没有奏效。

library(dplyr)

data %>% group_by(ID) %>% summarise_all(funs(max(data$date))) %>% funs(first(.[!is.na(.)]))

我应该使用什么来将工作代码应用于整个数据集?

答案

使用的解决方案。

library(dplyr)

dat2 <- dat %>%
  arrange(ID, desc(date)) %>%
  group_by(ID) %>%
  summarise_all(funs(first(.[!is.na(.)]))) %>%
  ungroup()
dat2
# # A tibble: 2 x 4
#   ID        date  var1  var2
#   <chr>    <int> <int> <int>
# 1 person1  72016   509    45
# 2 person2 122016   301    NA

数据

dat <- read.table(text = "ID         date      var1   var2
person1    '052016'    509    1678  
person2    '122016'    301    NA
person1    '072016'    NA     45",
                  header = TRUE, stringsAsFactors = FALSE)
另一答案

使用tidyversefill函数。加载数据:

Mar_df <- structure(list(ID = structure(c(1L, 2L, 1L), .Label = c("person1", 
"person2"), class = "factor"), date = c(52016L, 122016L, 72016L
), var1 = c(509L, 301L, NA), var2 = c(1678L, NA, 45L)), .Names = c("ID", 
"date", "var1", "var2"), class = "data.frame", row.names = c(NA, 
-3L))

然后:

Mar_df_summarised <- Mar_df %>% 
    arrange(ID,date) %>%
    fill(...=var1,.direction="down") %>% 
    group_by(ID) %>% 
    summarise_all(.funs=funs(last(.))) 

结果是:

# A tibble: 2 x 4
  ID        date  var1  var2
  <fctr>   <int> <int> <int>
1 person1  72016   509    45
2 person2 122016   301    NA

以上是关于R:在第一列中按重复项合并行的主要内容,如果未能解决你的问题,请参考以下文章

将excel一列中重复项合并,同时对应行的内容自动合并

C# DataTable行转列并合并重复列。

如何在第一列中只有最小元素的矩阵中查找行?

grep:在特定列中按编号保留行

合并多个 CSV 文件并删除 R 中的重复项

WPF中添加一个Datagrid使用dataset双向绑定,在第一列中添加一列checkbox用来选择本行,