Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用for循环和if条件创建新变量_R_Variables_If Statement_For Loop - Fatal编程技术网

使用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时,我都会使用简单的
粘贴
,或者有时使用
设置名称
。谢谢你。我会坚持使用
粘贴
和“设置名称”。