我需要从变量 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 一样。
谢谢
答案 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::mutate
与 across
一起使用:
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)