R 仅重塑数据帧中的几列
我正在尝试在R中重塑数据帧。以下是我在dput中拥有的数据帧: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
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()
。