仅重塑数据框中的几列

时间:2018-02-14 19:18:01

标签: r

我正在尝试重塑R中的数据帧。这是我在dput中的数据帧:

dput(newdata)
    structure(list(var1 = c(0L, 0L, 0L, 0L, 0L, 0L), var2 = c(0L, 
    0L, 0L, 0L, 0L, 0L), var3 = c(0L, 0L, 0L, 0L, 0L, 0L), Date = structure(c(15260, 
    15260, 15260, 15169, 15169, 15169), class = "Date"), Success = structure(c(2L, 
    1L, 1L, 2L, 1L, 1L), .Label = c("N", "Y"), class = "factor")), .Names = c("var1", 
    "var2", "var3", "Date", "Success"), row.names = c(NA, 6L), class = "data.frame")

我正在寻找输出:

Variable    Date    N   Y
var1    3/2/2012    0   1
var1    3/4/2012    0   1
var1    3/6/2012    0   1
var2    3/2/2012    1   0
var2    3/4/2012    1   0
var2    3/6/2012    1   0
var3    3/2/2012    0   1
var3    3/4/2012    0   1
var3    3/6/2012    0   1

我是R的新手。我一直在尝试使用reshape()模块但直到现在都没有成功。任何见解都会非常感激。谢谢。

2 个答案:

答案 0 :(得分:1)

感谢您提供可重复的输入和所需的输出。这有很大帮助。不幸的是,现在您的输入存在缺陷:数据框中的第2行和第3行是相同的,第5行和第6行也是如此。无法在这些数据上正确执行所需的数据转换。

假设您的重复行不相关,您可以通过tidyr::spread()tidyr::gather()完成所需的输出。我将您的数据结构称为df

library("dplyr") 
library("tidyr")

# call to duplicated() removes all identical rows from df 

wide <- df %>%
  filter(!duplicated(.)) %>% 
  gather(Variable, value, starts_with("var")) %>% 
  spread(Success, value, fill = NA, drop = FALSE)

wide
        Date Variable N Y
1 2011-07-14     var1 0 0
2 2011-07-14     var2 0 0
3 2011-07-14     var3 0 0
4 2011-10-13     var1 0 0
5 2011-10-13     var2 0 0
6 2011-10-13     var3 0 0    

答案 1 :(得分:0)

正如kgolyaev所述,你有重复的行,这意味着在传播列时,传播不能简化为单行。解决此问题的一种方法是仅使用mutateifelse而不是传播。这是有效的,因为你只有&#34; N&#34;和&#34; Y&#34;成功价值观。如果它是12个独特的价值,那将是一个不同的解决方案。

我们可以将vars收集到varsnum。然后我们可以使用一个简单的嵌套ifelse语句来获取1和0。然后删除不需要的列并按Date排列。

library(tidyverse)

df %>% gather("vars", "num", -c(Date, Success)) %>%
        mutate(Y = ifelse(Success == "N", 0, 1),
               N = ifelse(Success == "N", 1, 0)) %>%
        select(-c(Success, num)) %>%
        arrange(Date)


         Date vars Y N
1  2011-07-14 var1 1 0
2  2011-07-14 var1 0 1
3  2011-07-14 var1 0 1
4  2011-07-14 var2 1 0
5  2011-07-14 var2 0 1
6  2011-07-14 var2 0 1
7  2011-07-14 var3 1 0
8  2011-07-14 var3 0 1
9  2011-07-14 var3 0 1
10 2011-10-13 var1 1 0
11 2011-10-13 var1 0 1
12 2011-10-13 var1 0 1
13 2011-10-13 var2 1 0
14 2011-10-13 var2 0 1
15 2011-10-13 var2 0 1
16 2011-10-13 var3 1 0
17 2011-10-13 var3 0 1
18 2011-10-13 var3 0 1