R 仅重塑数据帧中的几列

R 仅重塑数据帧中的几列,r,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 = "Da

我正在尝试在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相当陌生。我一直在尝试使用重塑()模块,但直到现在都没有成功。任何洞察都将不胜感激。谢谢。

感谢您提供可复制的输入和所需的输出。这很有帮助。不幸的是,现在显示的输入有缺陷:数据框中的第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    
库(“dplyr”)
图书馆(“tidyr”)
#调用duplicated()从df中删除所有相同的行
宽%
筛选器(!重复(.))%>%
聚集(变量,值,以(“var”)开头)%>%
排列(成功、值、填充=NA、下降=FALSE)
宽的
日期变量NY
2011年7月14日第10版
2 2011-07-14 VAR200
3 2011-07-14 var3 0 0 0
4 2011-10-13 var1 0 0 0
5 2011-10-13 VAR200
6 2011-10-13 var3 0 0 0

正如kgolyaev所说,您有重复的行,这意味着在扩展列时,扩展不能简化为一行。解决这个问题的一种方法是使用
变异
ifelse
而不是传播。这是有效的,因为成功值只有“N”和“Y”。如果它是12个唯一的值,它将是一个不同的解决方案

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

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

你能在你的数据上使用
dput()
来打印这里的结构吗?我不想费力地浏览所有的html来修改格式。不要使用代码段功能来显示数据。按照建议使用
dput
,如果您想显示几行,只需复制并粘贴它们,并将它们格式化为代码块。另外,请显示您尝试过的内容。抱歉,我对这方面很陌生。这里是confusionOk-现在您希望输出是什么样子?您正在尝试重塑哪些列?var1-3列是否从宽变长?我建议使用
distinct()
而不是
filter()
+
duplicated()