使用for循环和if条件创建新变量
我有一个如下的数据框使用for循环和if条件创建新变量,r,variables,if-statement,for-loop,R,Variables,If Statement,For Loop,我有一个如下的数据框 head(sip1) ID INTERVIEWDATE SS1 SS2 SS2b SS3 SS4_1 SS4_2 SS4_3 SS4_4 SS4_5 SS4_6 SS4_7 SS4_8 SS4_9 SS4_10 SS4_11 SS4_12 SS4_13 SS4_14 SS4_15 SS4_16 SS4_17 SS4_18 SS4_19 SS4_20 SS4_21 SS4_22 1 1 2014-03-19 4 1 1 2 1
head(sip1)
ID INTERVIEWDATE SS1 SS2 SS2b SS3 SS4_1 SS4_2 SS4_3 SS4_4 SS4_5 SS4_6 SS4_7 SS4_8 SS4_9 SS4_10 SS4_11 SS4_12 SS4_13 SS4_14 SS4_15 SS4_16 SS4_17 SS4_18 SS4_19 SS4_20 SS4_21 SS4_22
1 1 2014-03-19 4 1 1 2 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1
2 2 2014-03-19 2 1 5 1 1 1 1 1 1 1 2 1 1 1 1 1 1 1 4 1 1 1 1 1 1 1
3 3 2014-03-19 3 1 8 2 1 1 1 4 1 1 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4 4 2014-03-18 3 1 5 1 1 1 1 1 1 1 1 1 3 1 1 1 1 1 1 1 1 1 1 1 1 1
5 5 2014-03-18 3 1 8 1 1 1 1 1 1 1 1 1 3 1 1 1 1 2 1 1 1 1 1 1 1 1
6 6 2014-03-19 3 1 1 2 1 1 1 1 1 1 1 1 3 1 1 3 1 3 1 1 1 1 1 1 1 1
SS4_23 SS4_24 SS4_25 SS4_26 SS4_27 SS4_28 SS4_29 SS4_30 SS5 SS6 SS7 HS1_C1_A HS1_C1_B HS1_C1_C HS1_C1_D HS1C1
1 1 1 1 1 1 1 1 1 1 2 2 1 2 2 2 1
2 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 0
3 1 1 1 1 1 1 1 1 1 2 2 1 2 2 2 1
4 1 1 1 1 1 1 1 1 2 2 2 1 2 2 2 1
5 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 0
6 1 1 1 1 1 1 1 1 1 2 2 1 2 2 2 1
在这里,我想创建一系列关于
SS4\u 1
,news4\u 2
,news4\u 3
,news4\u 30
)的新变量,SS4\u 1
,SS4\u 30
,使用news4\u 1[SS4\u 1==1]这是一种方法。这里有一个ifelse语句,正如您所描述的contains(“SS4”)
表示R将此ifelse语句应用于包含“SS4”的所有列。在这个建议中,我将覆盖现有列
foo <- data.frame(id = 1:5,
date = c("2014-03-19", "2014-03-19", "2014-03-19", "2014-03-18", "2014-03-18"),
SS4_1 = c(1,0,2,1,0),
SS4_2 = c(3,1,0,7,2),
stringsAsFactors = FALSE)
# id date SS4_1 SS4_2
#1 1 2014-03-19 1 3
#2 2 2014-03-19 0 1
#3 3 2014-03-19 2 0
#4 4 2014-03-18 1 7
#5 5 2014-03-18 0 2
library(dplyr)
ana <- foo %>%
mutate_each(funs(ifelse(. == 1, 0, 1)), contains("SS4_"))
colnames(ana) <- gsub("vars", "newSS4_", colnames(ana))
# id date SS4_1 SS4_2 newSS4_1 newSS4_2
#1 1 2014-03-19 1 3 0 1
#2 2 2014-03-19 0 1 1 0
#3 3 2014-03-19 2 0 1 1
#4 4 2014-03-18 1 7 0 1
#5 5 2014-03-18 0 2 1 1
foo这里有一种方法。这里有一个ifelse语句,正如您所描述的contains(“SS4”)
表示R将此ifelse语句应用于包含“SS4”的所有列。在这个建议中,我将覆盖现有列
foo <- data.frame(id = 1:5,
date = c("2014-03-19", "2014-03-19", "2014-03-19", "2014-03-18", "2014-03-18"),
SS4_1 = c(1,0,2,1,0),
SS4_2 = c(3,1,0,7,2),
stringsAsFactors = FALSE)
# id date SS4_1 SS4_2
#1 1 2014-03-19 1 3
#2 2 2014-03-19 0 1
#3 3 2014-03-19 2 0
#4 4 2014-03-18 1 7
#5 5 2014-03-18 0 2
library(dplyr)
ana <- foo %>%
mutate_each(funs(ifelse(. == 1, 0, 1)), contains("SS4_"))
colnames(ana) <- gsub("vars", "newSS4_", colnames(ana))
# id date SS4_1 SS4_2 newSS4_1 newSS4_2
#1 1 2014-03-19 1 3 0 1
#2 2 2014-03-19 0 1 1 0
#3 3 2014-03-19 2 0 1 1
#4 4 2014-03-18 1 7 0 1
#5 5 2014-03-18 0 2 1 1
使用Jazzurro的数据
(foo[paste0("SS4_", 1:2)] !=1) + 0
# SS4_1 SS4_2
#[1,] 0 1
#[2,] 1 0
#[3,] 1 1
#[4,] 0 1
#[5,] 1 1
foo[paste0(“SS4”,1:2)]=1
测试不等于1的值-结果为TRUE
或FALSE
。一种通过加零将其转换为1和0的方法
编辑:添加到现有数据集
newvars <- (foo[paste0("SS4_", 1:2)] !=1) + 0
colnames(newvars) <- paste0("new", colnames(newvars))
cbind(foo, newvars)
数据
sip1使用Jazzurro的数据
(foo[paste0("SS4_", 1:2)] !=1) + 0
# SS4_1 SS4_2
#[1,] 0 1
#[2,] 1 0
#[3,] 1 1
#[4,] 0 1
#[5,] 1 1
foo[paste0(“SS4”,1:2)]=1
测试不等于1的值-结果为TRUE
或FALSE
。一种通过加零将其转换为1和0的方法
编辑:添加到现有数据集
newvars <- (foo[paste0("SS4_", 1:2)] !=1) + 0
colnames(newvars) <- paste0("new", colnames(newvars))
cbind(foo, newvars)
数据
sip1试试:
尝试:
使用数据表
<代码>sip1
和@user20650帖子中的索引
library(data.table)
nm1 <- grep("^SS4_", colnames(sip1), value=TRUE)
setDT(sip1)[,(paste0("new", nm1)):= lapply(.SD, function(x) (x!=1)+0),
.SDcols=nm1]
grep("SS4", colnames(sip1), value=TRUE)
# [1] "SS4_1" "SS4_2" "SS4_3" "SS4_4" "SS4_5" "SS4_6"
# [7] "SS4_7" "SS4_8" "SS4_9" "SS4_10" "SS4_11" "SS4_12"
# [13] "SS4_13" "SS4_14" "SS4_15" "SS4_16" "SS4_17" "SS4_18"
# [19] "SS4_19" "SS4_20" "SS4_21" "SS4_22" "SS4_23" "SS4_24"
# [25] "SS4_25" "SS4_26" "SS4_27" "SS4_28" "SS4_29" "SS4_30"
# [31] "newSS4_1" "newSS4_2" "newSS4_3" "newSS4_4" "newSS4_5" "newSS4_6"
# [37] "newSS4_7" "newSS4_8" "newSS4_9" "newSS4_10" "newSS4_11" "newSS4_12"
# [43] "newSS4_13" "newSS4_14" "newSS4_15" "newSS4_16" "newSS4_17" "newSS4_18"
# [49] "newSS4_19" "newSS4_20" "newSS4_21" "newSS4_22" "newSS4_23" "newSS4_24"
# [55] "newSS4_25" "newSS4_26" "newSS4_27" "newSS4_28" "newSS4_29" "newSS4_30"
库(data.table)
nm1使用数据表
<代码>sip1
和@user20650帖子中的索引
library(data.table)
nm1 <- grep("^SS4_", colnames(sip1), value=TRUE)
setDT(sip1)[,(paste0("new", nm1)):= lapply(.SD, function(x) (x!=1)+0),
.SDcols=nm1]
grep("SS4", colnames(sip1), value=TRUE)
# [1] "SS4_1" "SS4_2" "SS4_3" "SS4_4" "SS4_5" "SS4_6"
# [7] "SS4_7" "SS4_8" "SS4_9" "SS4_10" "SS4_11" "SS4_12"
# [13] "SS4_13" "SS4_14" "SS4_15" "SS4_16" "SS4_17" "SS4_18"
# [19] "SS4_19" "SS4_20" "SS4_21" "SS4_22" "SS4_23" "SS4_24"
# [25] "SS4_25" "SS4_26" "SS4_27" "SS4_28" "SS4_29" "SS4_30"
# [31] "newSS4_1" "newSS4_2" "newSS4_3" "newSS4_4" "newSS4_5" "newSS4_6"
# [37] "newSS4_7" "newSS4_8" "newSS4_9" "newSS4_10" "newSS4_11" "newSS4_12"
# [43] "newSS4_13" "newSS4_14" "newSS4_15" "newSS4_16" "newSS4_17" "newSS4_18"
# [49] "newSS4_19" "newSS4_20" "newSS4_21" "newSS4_22" "newSS4_23" "newSS4_24"
# [55] "newSS4_25" "newSS4_26" "newSS4_27" "newSS4_28" "newSS4_29" "newSS4_30"
库(data.table)
谢谢。但是。。。1.我不想覆盖。那么如何创建新变量并将它们添加到数据框中。2.“funs(ifelse(.==1,0,-1)”是什么意思?我只想要1和0。再次感谢。我以为你的问题中的意思是-1。你可以尝试对每个(funs(ifelse(.==1,0,1)),vars=contains(“SS4”)
谢谢。但是…1.我不想覆盖。那么如何创建新变量并将它们添加到数据框中。2.funs(ifelse)是什么意思(..==1,0,-1)“意思?我只想要1和0。再次感谢。我以为你的问题中的意思是-1。你可以尝试mutate_each(funs(ifelse(..==1,0,1)),vars=contains(“SS4”))
Good day。看到这篇文章后,我想知道将来是否会创建transmute\u每个
。至少,使用您之前提到的粘贴和更改colname会很好。@jazzurro可能是,但是如果有分组变量,请确保在执行tr之前取消分组以删除分组变量ansmute
。是的,谢谢。我一直在想,像重命名(newnames=contains(“vars”)这样的东西
可能是一个可行的方法。你试过类似的方法吗?@jazzurro不,我没有做过类似的事情。每当我想重新命名columna时,我都会使用简单的粘贴
,或者有时使用设置名称
。谢谢你。我会坚持使用粘贴
和“设置名称”。再见。看到这篇文章后,我很高兴如果transmute\u每个都将在将来创建。至少,使用您之前提到的粘贴和更改colnames会很好。@jazzurro可能是,但是如果有分组变量,请确保在执行transmute
之前取消分组以删除组变量。是的,谢谢。我一直在如果类似于重命名(new names=contains(“vars”),则ondering
可能是一个可行的方法。你试过类似的方法吗?@jazzurro不,我没有做过类似的事情。每当我想重命名columna时,我都会使用简单的粘贴
,或者有时使用设置名称
。谢谢你。我会坚持使用粘贴
和“设置名称”。