如何使用 forloop 创建列序列

时间:2021-01-12 15:07:05

标签: r

我需要从变量 y 中创建变量 x,如下所示。

df$x<-0
df$x<-ifelse(df$y==0 | df$y==1, 1, 0)
df$x[is.na(df$x)] <- 0

但是,我的 y 范围从 1 到 52,这意味着我需要通过 x52 创建 x1。我是一个狂热的 stata 用户,使用 forval 函数非常简单。但是我在 R 中遇到了困难。我考虑了以下内容,但它没有很好地锻炼:

for (i in 1:52){
  df$x[i] <- 0
.
.
.
}

我想我可以让 r 用循环中的值替换 i ,就像 stata 一样。

谢谢

2 个答案:

答案 0 :(得分:0)

尝试这样的事情。这是使用虚拟数据的示例:

set.seed(123)
#Data
df <- as.data.frame(matrix(rnorm(520),nrow = 10,ncol = 52))
names(df) <- paste0('y',1:52)
#new names
vals <- paste0('x',1:52)
#Loop
for(i in vals)
{
  df[[i]]<-0
  df[[i]]<-ifelse(df[[gsub('x','y',i)]]==0 | df[[gsub('x','y',i)]]==1, 1, 0)
  df[[i]][is.na(df[[i]])] <- 0
}

答案 1 :(得分:0)

假设您的数据如下所示:

data
   x1 x2 x3 x4 x5 x6 x7 x8 x9 x10
1   1  3  0 NA  3 NA  3  1  2   3
2   1  1 NA NA  3  0  3  3  0   0
3   0  1  1  0  2  2  1  1  0   1
4   0 NA  2  1  3  2 NA  0  2   0
5   1  2 NA  2  0  1  2  3  2   3
6   3 NA  1  3 NA NA NA  3 NA   3
7   2 NA  3  3 NA  0 NA  1  1   1
8  NA  3  2  1  1 NA  1  0  1   2
9   0  1  0 NA NA  0  2  0 NA   2
10  1  0  3  0  3  2 NA  0  1   2

一种方法可能是将 dplyr::mutateacross 一起使用:

library(tidyverse)
data %>%
  mutate(across(everything(),~ ifelse(. %in% c(0,1), 1, 0),
                .names = "y{.col}")) %>%
  rename_all(~str_replace(.,"yx","y"))
   x1 x2 x3 x4 x5 x6 x7 x8 x9 x10 y1 y2 y3 y4 y5 y6 y7 y8 y9 y10
1   2  1  2  2  2  2  0  1  1   0  0  1  0  0  0  0  1  1  1   1
2   3  2  3  1  3  3  3  2  0   1  0  0  0  1  0  0  0  0  1   1
3   0  2  2  1  0  2  3  0  2   0  1  0  0  1  1  0  0  1  0   1
4   2  2  3  1  0  0  1  1  2   3  0  0  0  1  1  1  1  1  0   0
5   1  3  1  2  2  2  3  2  3   3  1  0  1  0  0  0  0  0  0   0
6   3  1  1  1  0  3  2  2  1   2  0  1  1  1  1  0  0  0  1   0
7   1  1  3  1  3  1  1  0  1   2  1  1  0  1  0  1  1  1  1   0
8   1  2  3  3  2  1  2  2  2   0  1  0  0  0  0  1  0  0  0   1
9   1  2  3  0  2  3  0  0  2   1  1  0  0  1  0  0  1  1  0   1
10  2  0  1  0  3  2  3  2  2   3  0  1  1  1  0  0  0  0  0   0

示例数据:

set.seed(123)
data <- as.data.frame(matrix(sample(c(NA,0:3),100,replace = TRUE),ncol =10))
names(data) <- paste0("x",1:10)