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