我有一个时间序列数据,我想向左添加一个递增的数字。例如,在V1我想加1,在V2我想加2,所以在VN列将得到+N的加法。
因为我的心理模型固定在dplyr类语法上,所以我真的希望尽可能避免循环操作……
我的想法是,当我对这些时间序列数据进行排序/排列时,我希望确保最后一列将获得最高的重要性。这可以通过稍后获得逐行求和来完成。
set.seed(1990)
ID <- rep(c('A','B','C'),each = 1)
n <- sample(c(0,1), replace=TRUE, size=45)
df <- tibble(ID)
df <- cbind(df, as.data.frame(matrix(n, nrow = 3)))

到目前为止,我的表还没有正确排序,因为时间序列在这里和那里有很多空隙。
谢谢!

发布于 2021-01-04 14:14:31
您可以从tidyr包(属于tidyverse )中使用pivot_longer使df长,添加一个包含要添加的数字的虚拟行,执行加法操作,删除虚拟行并将其带回更宽的形式。
library(tidyverse)
set.seed(1990)
ID <- rep(c('A','B','C'),each = 1)
n <- sample(c(0,1), replace=TRUE, size=45)
df <- tibble(ID)
df <- cbind(df, as.data.frame(matrix(n, nrow = 3)))
df %>%
pivot_longer(V1:V15) %>%
mutate(rn = rep(1:15,3)) %>%
mutate(value = value + rn) %>%
select(-rn) %>%
pivot_wider()
#> # A tibble: 3 x 16
#> ID V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12
#> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 A 1 3 3 4 6 6 8 8 9 11 12 12
#> 2 B 1 3 4 5 5 6 8 8 9 10 11 12
#> 3 C 2 3 3 5 6 7 8 8 9 10 12 12
#> # … with 3 more variables: V13 <dbl>, V14 <dbl>, V15 <dbl>发布于 2021-01-04 13:51:40
以下是使用1) Map和2) sweep的几个基本R选项
#1)
df[-1] <- Map(`+`, df[-1], seq_along(df[-1]))
#2)
df[-1] <- sweep(df[-1], 2, seq_along(df[-1]), `+`)使用最新的dplyr (>=1.0.0),您可以通过以下方式使用cur_column():
library(dplyr)
df %>% mutate(across(V1:V15, ~. + match(cur_column(), names(df)) - 1))或者使用类似于base R方法的purrr的map2:
df[-1] <- purrr::map2(df[-1], seq_along(df[-1]), `+`)所有这些都会返回:
df
# ID V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15
#1 A 1 3 3 4 6 6 8 8 9 11 12 12 13 15 16
#2 B 1 3 4 5 5 6 8 8 9 10 11 12 14 14 15
#3 C 2 3 3 5 6 7 8 8 9 10 12 12 14 15 16https://stackoverflow.com/questions/65558154
复制相似问题