Dataframe 压缩数据帧

Dataframe 压缩数据帧,dataframe,r,na,data-cleaning,Dataframe,R,Na,Data Cleaning,我怎样才能浓缩这一点: 看起来像: Date AAPL MSFT NASDAQ 1.1.19 NA NA NA 2.1.19 2% 4% 5% 3.1.19 3% 5% 6% ... 是否有一个函数可以不包含重复的日期和NASDAQ值,并删除NAs 谢谢 我们可以使用总结所有(假设每个列的每个“日期”只有一个非NA元素) 如果我们有多个非NA元素,并且在某些情况下只有NAs,请创建列表列或粘贴 df %>% group_by(

我怎样才能浓缩这一点:

看起来像:

Date    AAPL   MSFT NASDAQ
1.1.19  NA     NA   NA
2.1.19  2%     4%   5%
3.1.19  3%     5%   6%
...
是否有一个函数可以不包含重复的日期和NASDAQ值,并删除
NA
s


谢谢

我们可以使用
总结所有
(假设每个列的每个“日期”只有一个非NA元素)


如果我们有多个非NA元素,并且在某些情况下只有NAs,请创建
列表
列或
粘贴

df %>%
    group_by(Date) %>%
    summarise_at(vars(-group_cols()), ~ list(if(all(is.na(.))) .[n() + 1] else .[!is.na(.)]))
# A tibble: 3 x 4
#  Date   AAPL      MSFT      NASDAQ   
#  <chr>  <list>    <list>    <list>   
#1 1.1.19 <chr [1]> <chr [1]> <chr [1]>
#2 2.1.19 <chr [1]> <chr [1]> <chr [2]>
#3 3.1.19 <chr [1]> <chr [1]> <chr [2]>
或者先执行
distinct
,然后执行分组操作

distinct(df) %>% 
      group_by(Date) %>% 
      summarise_at(vars(-group_cols()), ~ .[!is.na(.)][1])
# A tibble: 3 x 4
#  Date   AAPL  MSFT  NASDAQ
#  <chr>  <chr> <chr> <chr> 
#1 1.1.19 <NA>  <NA>  <NA>  
#2 2.1.19 2%    4%    5%    
#3 3.1.19 3%    5%    6%   
数据
df以下是一些基本的R解决方案:

  • 使用
    split
    +
    rbind
以致

> dfout
    Date AAPL MSFT NASDAQ
1 1.1.19 <NA> <NA>   <NA>
2 2.1.19   2%   4%     5%
3 3.1.19   3%   5%     6%
>dfout
日期AAPL MSFT纳斯达克
1 1.1.19     
2 2.1.19   2%   4%     5%
3 3.1.19   3%   5%     6%
数据

df <- structure(list(Date = c("1.1.19", "2.1.19", "3.1.19", "1.1.19", 
"2.1.19", "3.1.19"), AAPL = c(NA, "2%", "3%", NA, NA, NA), MSFT = c(NA, 
NA, NA, NA, "4%", "5%"), NASDAQ = c(NA, "5%", "6%", NA, "5%", 
"6%")), class = "data.frame", row.names = c(NA, -6L))

df感谢您的回答。不幸的是,您的代码没有压缩数据帧。我已经调整了上面的最小示例,以更好地反映我的情况。@Ben你是说两种方法都不起作用?你能分享更多关于你所关心的问题的信息吗。
列表
应该将元素保存在一个
列表中
即每个“日期”对应一行@Ben我根据您的示例更新了帖子。我猜其中一个输出与您显示的相同。但是,我还保留了其他选项,以防您的数据集出现问题。更一般
distinct(df) %>% 
      group_by(Date) %>% 
      summarise_at(vars(-group_cols()), ~ .[!is.na(.)][1])
# A tibble: 3 x 4
#  Date   AAPL  MSFT  NASDAQ
#  <chr>  <chr> <chr> <chr> 
#1 1.1.19 <NA>  <NA>  <NA>  
#2 2.1.19 2%    4%    5%    
#3 3.1.19 3%    5%    6%   
df %>% 
     group_by(Date) %>% 
     condense(data = across(everything(),  ~ .[!is.na(.)]))
# A tibble: 3 x 2
# Rowwise:  Date
#  Date   data            
#  <chr>  <list>          
#1 1.1.19 <tibble [0 × 3]>
#2 2.1.19 <tibble [2 × 3]>
#3 3.1.19 <tibble [2 × 3]>
df <- structure(list(Date = c("1.1.19", "2.1.19", "3.1.19", "1.1.19", 
"2.1.19", "3.1.19"), AAPL = c(NA, "2%", "3%", NA, NA, NA), MSFT = c(NA, 
NA, NA, NA, "4%", "5%"), NASDAQ = c(NA, "5%", "6%", NA, "5%", 
"6%")), class = "data.frame", row.names = c(NA, -6L))
dfout <- do.call(rbind,
                 c(make.row.names = F,
                   Map(function(z) data.frame(Map(function(x) ifelse(all(is.na(x)),NA,na.omit(x)),z)),
                       split(df,df$Date))))
dfout <- unique(cbind(df[1],
                      sapply(df[-1],
                             function(q) ave(q,df$Date,FUN = function(x) ifelse(all(is.na(x)),NA,na.omit(x))))))
> dfout
    Date AAPL MSFT NASDAQ
1 1.1.19 <NA> <NA>   <NA>
2 2.1.19   2%   4%     5%
3 3.1.19   3%   5%     6%
df <- structure(list(Date = c("1.1.19", "2.1.19", "3.1.19", "1.1.19", 
"2.1.19", "3.1.19"), AAPL = c(NA, "2%", "3%", NA, NA, NA), MSFT = c(NA, 
NA, NA, NA, "4%", "5%"), NASDAQ = c(NA, "5%", "6%", NA, "5%", 
"6%")), class = "data.frame", row.names = c(NA, -6L))