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))