根据条件

时间:2018-06-05 12:00:21

标签: r

我的Dataframe看起来与此类似

 Date   Key  Value1  Value2
   D1   1A     2
   D1   2A     1      2
   D2   3B     1      3
   D2   1A     3
   D3   2A     5

正如您所看到的,Key本身并非主要内容,但如果我们一起考虑DateKey,则每次观察都会将其视为主键。 现在我希望在Value1Value2都存在的每个观察中实现这一点,复制行并将它们分成两行。像这样:

Date   Key  Value1  Value2  Value
D1     1A     2               2
D1     2A     1       2       1
D1     2A     1       2       2
D2     3B     1       3       1
D2     3B     1       3       3
D3     2A     5               5

无论如何我能做到这一点吗? 提前谢谢。

2 个答案:

答案 0 :(得分:1)

你可能想要这个:

df %>% gather(keys,Value,-Date,-Key) %>% filter(!is.na(Value)) %>% arrange(Date,Key)

  Date Key   keys Value
1   D1  1A Value1     2
2   D1  2A Value1     1
3   D1  2A Value2     2
4   D2  1A Value1     3
5   D2  3B Value1     1
6   D2  3B Value2     3
7   D3  2A Value1     5

答案 1 :(得分:0)

您也可以使用unnest

library(tidyverse)
df %>%
  rowwise %>%
  mutate(Value3 = ifelse(is.na(Value2),list(Value1),list(c(Value1,Value2)))) %>%
  unnest

# # A tibble: 7 x 5
#    Date   Key Value1 Value2 Value3
#   <chr> <chr>  <int>  <int>  <int>
# 1    D1    1A      2     NA      2
# 2    D1    2A      1      2      1
# 3    D1    2A      1      2      2
# 4    D2    3B      1      3      1
# 5    D2    3B      1      3      3
# 6    D2    1A      3     NA      3
# 7    D3    2A      5     NA      5

数据

df <- read.table(text="
Date   Key  Value1  Value2
D1   1A     2      NA
D1   2A     1      2
D2   3B     1      3
D2   1A     3      NA
D3   2A     5      NA",h=T,strin=F
)