R 如何通过重复观察将TIBLE从一列转换为两列
我试图将R 如何通过重复观察将TIBLE从一列转换为两列,r,tibble,R,Tibble,我试图将df转换为df2。我使用df3以一种非常零散的方式完成了它,有没有更简单、更优雅的方法 library(tidyverse) # I want to transform df df <- tibble(id = c(1, 2, 1, 2, 1, 2), time = c('t1', 't1', 't2', 't2', 't3', 't3'), value = c(2, 3, 6, 4, 5, 7)) df #> # A t
df
转换为df2
。我使用df3
以一种非常零散的方式完成了它,有没有更简单、更优雅的方法
library(tidyverse)
# I want to transform df
df <- tibble(id = c(1, 2, 1, 2, 1, 2),
time = c('t1', 't1', 't2', 't2', 't3', 't3'),
value = c(2, 3, 6, 4, 5, 7))
df
#> # A tibble: 6 x 3
#> id time value
#> <dbl> <chr> <dbl>
#> 1 1 t1 2
#> 2 2 t1 3
#> 3 1 t2 6
#> 4 2 t2 4
#> 5 1 t3 5
#> 6 2 t3 7
# into df2
df2 <- tibble(id = c(1, 2, 1, 2),
t = c(2, 3, 6, 4),
r = c(6, 4, 5, 7))
df2
#> # A tibble: 4 x 3
#> id t r
#> <dbl> <dbl> <dbl>
#> 1 1 2 6
#> 2 2 3 4
#> 3 1 6 5
#> 4 2 4 7
# This is how I did it, but I think it should be a better way
df3 <- df %>% pivot_wider(names_from = time, values_from = value)
b <- tibble(id = numeric(), t = numeric(), r = numeric())
for (i in 2:3){
a <- df3[,c(1,i,i+1)]
colnames(a) <- c('id', 't', 'r')
b <- bind_rows(a, b)
}
b
#> # A tibble: 4 x 3
#> id t r
#> <dbl> <dbl> <dbl>
#> 1 1 6 5
#> 2 2 4 7
#> 3 1 2 6
#> 4 2 3 4
Created on 2020-11-25 by the reprex package (v0.3.0)
库(tidyverse)
#我想转换df
df#A tible:6 x 3
#>id时间值
#>
#>1 t1 2
#>2 t1 3
#>3 1 t2 6
#>4 2 t2 4
#>5 1 t3 5
#>6 2 t3 7
#进入df2
df2#A tible:4 x 3
#>id t r
#>
#> 1 1 2 6
#> 2 2 3 4
#> 3 1 6 5
#> 4 2 4 7
#我就是这样做的,但我认为这应该是一个更好的方法
df3%轴宽(名称从=时间,值从=值)
b1165
#> 2 2 4 7
#> 3 1 2 6
#> 4 2 3 4
由reprex软件包(v0.3.0)于2020年11月25日创建
对于每个id
,您可以使用lead
选择下一个值,创建r
列并删除NA
行
library(dplyr)
df %>%
group_by(id) %>%
mutate(t = value,
r = lead(value)) %>%
na.omit() %>%
select(id, t, r)
# id t r
# <dbl> <dbl> <dbl>
#1 1 2 6
#2 2 3 4
#3 1 6 5
#4 2 4 7
库(dplyr)
df%>%
分组依据(id)%>%
突变(t=值,
r=铅(值))%>%
na.省略()%>%
选择(id、t、r)
#id t r
#
#1 1 2 6
#2 2 3 4
#3 1 6 5
#4 2 4 7
我们可以从dplyr
版本>=1.0中使用摘要。以前,它限制每个组只返回一个观察结果。从版本>=1.0开始,情况不再如此。可以返回任意数量的行,即可以比原始行数短或长
library(dplyr)
df %>%
group_by(id) %>%
summarise(t = value[-n()], r = value[-1], .groups = 'drop')
-输出
# A tibble: 4 x 3
# id t r
# <dbl> <dbl> <dbl>
#1 1 2 6
#2 1 6 5
#3 2 3 4
#4 2 4 7
#一个tible:4 x 3
#id t r
#
#1 1 2 6
#2 1 6 5
#3 2 3 4
#4 2 4 7