我正在尝试重塑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()模块但直到现在都没有成功。任何见解都会非常感激。谢谢。
答案 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所述,你有重复的行,这意味着在传播列时,传播不能简化为单行。解决此问题的一种方法是仅使用mutate
与ifelse
而不是传播。这是有效的,因为你只有&#34; N&#34;和&#34; Y&#34;成功价值观。如果它是12个独特的价值,那将是一个不同的解决方案。
我们可以将vars
收集到vars
和num
。然后我们可以使用一个简单的嵌套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