循环R中的数据帧行,根据条件创建向量不´;行不通

循环R中的数据帧行,根据条件创建向量不´;行不通,r,R,我试图通过逐行循环数据帧来创建一个二进制向量。如果行中的第一个非零数字是1,我希望将1打印到向量中,如果是-1,我希望打印0。数据帧包括1、0和-1作为条目。到目前为止,我的代码看起来像这样,但没有输出所需的向量(只有第一个条目是正确的,其他每个条目都是零) counter我认为这会大大简化你的生活 使用dplyr包中的mutate代替for循环, 并且,在时使用case\u,而不是长链的else-if library(dplyr) Temp %>% mutate(Choice = ca

我试图通过逐行循环数据帧来创建一个二进制向量。如果行中的第一个非零数字是1,我希望将1打印到向量中,如果是-1,我希望打印0。数据帧包括1、0和-1作为条目。到目前为止,我的代码看起来像这样,但没有输出所需的向量(只有第一个条目是正确的,其他每个条目都是零)


counter我认为这会大大简化你的生活

使用
dplyr
包中的
mutate
代替for循环, 并且,在
时使用
case\u,而不是长链的else-if

library(dplyr)
Temp %>%
 mutate(Choice = case_when(
  
  !(Stereo      ==  0 | Stereo      == -1) ~ 1, 
  !(Stereo      ==  1 | Stereo      ==  0) ~ 0,
  !(Mono        == -1 | Mono        ==  0) ~ 1,
  !(Mono        ==  1 | Mono        ==  0) ~ 0, 
  !(MS          == -1 | MS          ==  0) ~ 1,
  !(MS          ==  1 | MS          ==  0) ~ 0,
  !(HT1RB1      == -1 | HT1RB1      ==  0) ~ 1,
  !(HT1RB1      ==  1 | HT1RB1      ==  0) ~ 0,
  !(HT0RB0      == -1 | HT0RB0      ==  0) ~ 1,
  !(HT0RB0      ==  1 | HT0RB0      ==  0) ~ 0,
  !(ITD0.8SS100 == -1 | ITD0.8SS100 ==  0) ~ 1,
  !(ITD0.8SS100 ==  1 | ITD0.8SS100 ==  0) ~ 0,
  !(ITD1.2SS60  == -1 | ITD1.2SS60  ==  0) ~ 1,
  !(ITD1.2SS60  ==  1 | ITD1.2SS60  ==  0) ~ 0,
  !(ITD1.6SS100 == -1 | ITD1.6SS100 ==  0) ~ 1,
  !(ITD1.6SS100 ==  1 | ITD1.6SS100 ==  0) ~ 0))

对于一个好的可复制的例子,不需要共享私人数据或发布屏幕截图,只需要创建看起来可信的假数据

例如,您可以使用以下选项:

Temp <- replicate(8, sample(-1:1, size = 10, replace = TRUE))
colnames(Temp) <- c("Stereo",
                    "Mono",
                    "MS",
                    "HT1RB1",
                    "HT0RB0",
                    "ITD0.8SS100",
                    "ITD1.2SS60",
                    "ITD1.6SS100")
Temp <- as.data.frame(Temp)

Temp读取所需输出的内容,我认为可以改变方法

在这里,我循环遍历行中的元素,并在找到第一个非零元素时中断,该元素被添加到
vec

Temp <- replicate(8, sample(-1:1, size = 10, replace = TRUE))
colnames(Temp) <- c("Stereo",
                    "Mono",
                    "MS",
                    "HT1RB1",
                    "HT0RB0",
                    "ITD0.8SS100",
                    "ITD1.2SS60",
                    "ITD1.6SS100")
Temp <- as.data.frame(Temp)
Temp
#>    Stereo Mono MS HT1RB1 HT0RB0 ITD0.8SS100 ITD1.2SS60 ITD1.6SS100
#> 1       1   -1  0      1      1           0         -1          -1
#> 2       0   -1  1     -1      0           1          1          -1
#> 3      -1    0 -1      1      0           0          1           0
#> 4      -1    0  1      0      0          -1         -1          -1
#> 5       0    1  1     -1      1           0         -1           1
#> 6       0   -1  0     -1      0           0          0           1
#> 7      -1    0  0      0     -1           1          1          -1
#> 8       1   -1  1     -1      1          -1         -1          -1
#> 9       0   -1  1      0     -1           1         -1          -1
#> 10      0    1 -1      0     -1          -1          1          -1

vec <- rep(0, nrow(Temp))
for (i in 1:nrow(Temp)) {
    for(j in 1:ncol(Temp)) {
        if (Temp[i,j] > 0) {
            vec[i] <- 1
            break
        } 
        else if (Temp[i,j] < 0) {
            vec[i] <- -1 
            break
        }
    }
}
vec
#>  [1]  1 -1 -1 -1  1 -1 -1  1 -1  1
temp20-11-1011-1
#> 3      -1    0 -1      1      0           0          1           0
#> 4      -1    0  1      0      0          -1         -1          -1
#> 5       0    1  1     -1      1           0         -1           1
#> 6       0   -1  0     -1      0           0          0           1
#> 7      -1    0  0      0     -1           1          1          -1
#> 8       1   -1  1     -1      1          -1         -1          -1
#> 9       0   -1  1      0     -1           1         -1          -1
#> 10      0    1 -1      0     -1          -1          1          -1
vec(0){

vec[i]请包含一些样本数据(请使用
dput(mydata)
)若要重现您的问题,请尝试避免在R中为该类型的任务使用
for
循环。这可以很容易地进行矢量化,并且将更加简单易读。我建议在您的多个条件下使用
dplyr::case\u。@Wimpel我不确定是否允许,因为这是公司数据…我可以共享一个屏幕截图ink@csgroen我会试试看!谢谢:)现在看起来确实更好了,但是对于-1出现在1之前的一些行,它并没有给我正确的向量输出。但是它给了我一种不同的方法,也许我现在会想出来:)非常感谢!!我添加了一个编辑来帮助你找到一个好的可复制的示例。而且,我意识到你没有不需要按行
,因为
已矢量化时的
大小写。
Temp <- replicate(8, sample(-1:1, size = 10, replace = TRUE))
colnames(Temp) <- c("Stereo",
                    "Mono",
                    "MS",
                    "HT1RB1",
                    "HT0RB0",
                    "ITD0.8SS100",
                    "ITD1.2SS60",
                    "ITD1.6SS100")
Temp <- as.data.frame(Temp)
Temp
#>    Stereo Mono MS HT1RB1 HT0RB0 ITD0.8SS100 ITD1.2SS60 ITD1.6SS100
#> 1       1   -1  0      1      1           0         -1          -1
#> 2       0   -1  1     -1      0           1          1          -1
#> 3      -1    0 -1      1      0           0          1           0
#> 4      -1    0  1      0      0          -1         -1          -1
#> 5       0    1  1     -1      1           0         -1           1
#> 6       0   -1  0     -1      0           0          0           1
#> 7      -1    0  0      0     -1           1          1          -1
#> 8       1   -1  1     -1      1          -1         -1          -1
#> 9       0   -1  1      0     -1           1         -1          -1
#> 10      0    1 -1      0     -1          -1          1          -1

vec <- rep(0, nrow(Temp))
for (i in 1:nrow(Temp)) {
    for(j in 1:ncol(Temp)) {
        if (Temp[i,j] > 0) {
            vec[i] <- 1
            break
        } 
        else if (Temp[i,j] < 0) {
            vec[i] <- -1 
            break
        }
    }
}
vec
#>  [1]  1 -1 -1 -1  1 -1 -1  1 -1  1