基于其他变量创建新变量
Create new variable based on other variables
在 R 中工作,我有一个包含三个变量的数据框,如下所示:
var1 var2 var3
1 0.695783133 0.009036145 0.02409639
2 0.651006711 0.348993289 0.00000000
3 1.000000000 0.000000000 0.00000000
4 0.404185022 0.575991189 0.00000000
5 0.004863813 0.736381323 0.25097276
6 0.833827893 0.074183976 0.06231454
我想添加第四个变量 (var4
),其值将基于原始三个变量 (var1
、var2
、var3
的值) 通过以下方式:
如果var1
>= 0.5, var4
= 1
如果var2
>= 0.5, var4
= 2
如果var3
>= 0.5, var4
= 3
如果没有变量 >= 0.5,var4
= 4
例如像这样:
var1 var2 var3 var4
1 0.695783133 0.009036145 0.02409639 1
2 0.651006711 0.348993289 0.00000000 1
3 1.000000000 0.000000000 0.00000000 1
4 0.404185022 0.575991189 0.00000000 2
5 0.004863813 0.736381323 0.25097276 2
6 0.833827893 0.074183976 0.06231454 1
我相信有一个简单的方法可以做到这一点,但我无法弄清楚,因为我是 R 的新手。关于如何操作有什么建议吗?
与tidyverse
:
library(tidyverse)
df <- read.table(text=" var1 var2 var3
1 0.695783133 0.009036145 0.02409639
2 0.651006711 0.348993289 0.00000000
3 1.000000000 0.000000000 0.00000000
4 0.404185022 0.575991189 0.00000000
5 0.004863813 0.736381323 0.25097276
6 0.833827893 0.074183976 0.06231454 ")
df%>%
mutate(var4=case_when(
var1>=.5 ~ 1,
var2>=.5 ~ 2,
var3>=.5 ~ 3,
T~4))
var1 var2 var3 var4
1 0.695783133 0.009036145 0.02409639 1
2 0.651006711 0.348993289 0.00000000 1
3 1.000000000 0.000000000 0.00000000 1
4 0.404185022 0.575991189 0.00000000 2
5 0.004863813 0.736381323 0.25097276 2
6 0.833827893 0.074183976 0.06231454 1
如果您提供数据供我们使用,使用 dput() 会有所帮助。
但是,使用 dplyr 可能会像这样。
df <- df %>%
mutate(var4 = case_when (var1 >= 0.5 ~ 1,
var2 >= 0.5 ~ 2,
var3 >= 0.5 ~ 3,
TRUE ~ 4)
使用 Base r ifelse 就可以了
df_test<- read.table(text= "var1 var2 var3
1 0.695783133 0.009036145 0.02409639
2 0.651006711 0.348993289 0.00000000
3 1.000000000 0.000000000 0.00000000
4 0.404185022 0.575991189 0.00000000
5 0.004863813 0.736381323 0.25097276
6 0.833827893 0.074183976 0.06231454 ",header = T)
df_test$var4 <- ifelse(df_test$var1 > 0.5,1,ifelse(df_test$var2 > 0.5,2,ifelse(df_test$var3 > 0.5,3,4)))
鉴于 var1 在第一个位置,var2 在第二个位置,依此类推,那么您可以使用 max.col
和 ifelse
来捕捉您的最后一个条件,即
ifelse(rowSums(df >= 0.5) == 0, 4, max.col(df >= 0.5))
#if 0.5 is the maximum value then ifelse(rowSums(df >= 0.5) == 0,4,max.col(df)) will also do
#1 2 3 4 5 6
#1 1 1 2 2 1
可能是这样的:
sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)
在 R 中工作,我有一个包含三个变量的数据框,如下所示:
var1 var2 var3
1 0.695783133 0.009036145 0.02409639
2 0.651006711 0.348993289 0.00000000
3 1.000000000 0.000000000 0.00000000
4 0.404185022 0.575991189 0.00000000
5 0.004863813 0.736381323 0.25097276
6 0.833827893 0.074183976 0.06231454
我想添加第四个变量 (var4
),其值将基于原始三个变量 (var1
、var2
、var3
的值) 通过以下方式:
如果var1
>= 0.5, var4
= 1
如果var2
>= 0.5, var4
= 2
如果var3
>= 0.5, var4
= 3
如果没有变量 >= 0.5,var4
= 4
例如像这样:
var1 var2 var3 var4
1 0.695783133 0.009036145 0.02409639 1
2 0.651006711 0.348993289 0.00000000 1
3 1.000000000 0.000000000 0.00000000 1
4 0.404185022 0.575991189 0.00000000 2
5 0.004863813 0.736381323 0.25097276 2
6 0.833827893 0.074183976 0.06231454 1
我相信有一个简单的方法可以做到这一点,但我无法弄清楚,因为我是 R 的新手。关于如何操作有什么建议吗?
与tidyverse
:
library(tidyverse)
df <- read.table(text=" var1 var2 var3
1 0.695783133 0.009036145 0.02409639
2 0.651006711 0.348993289 0.00000000
3 1.000000000 0.000000000 0.00000000
4 0.404185022 0.575991189 0.00000000
5 0.004863813 0.736381323 0.25097276
6 0.833827893 0.074183976 0.06231454 ")
df%>%
mutate(var4=case_when(
var1>=.5 ~ 1,
var2>=.5 ~ 2,
var3>=.5 ~ 3,
T~4))
var1 var2 var3 var4
1 0.695783133 0.009036145 0.02409639 1
2 0.651006711 0.348993289 0.00000000 1
3 1.000000000 0.000000000 0.00000000 1
4 0.404185022 0.575991189 0.00000000 2
5 0.004863813 0.736381323 0.25097276 2
6 0.833827893 0.074183976 0.06231454 1
如果您提供数据供我们使用,使用 dput() 会有所帮助。
但是,使用 dplyr 可能会像这样。
df <- df %>%
mutate(var4 = case_when (var1 >= 0.5 ~ 1,
var2 >= 0.5 ~ 2,
var3 >= 0.5 ~ 3,
TRUE ~ 4)
使用 Base r ifelse 就可以了
df_test<- read.table(text= "var1 var2 var3
1 0.695783133 0.009036145 0.02409639
2 0.651006711 0.348993289 0.00000000
3 1.000000000 0.000000000 0.00000000
4 0.404185022 0.575991189 0.00000000
5 0.004863813 0.736381323 0.25097276
6 0.833827893 0.074183976 0.06231454 ",header = T)
df_test$var4 <- ifelse(df_test$var1 > 0.5,1,ifelse(df_test$var2 > 0.5,2,ifelse(df_test$var3 > 0.5,3,4)))
鉴于 var1 在第一个位置,var2 在第二个位置,依此类推,那么您可以使用 max.col
和 ifelse
来捕捉您的最后一个条件,即
ifelse(rowSums(df >= 0.5) == 0, 4, max.col(df >= 0.5))
#if 0.5 is the maximum value then ifelse(rowSums(df >= 0.5) == 0,4,max.col(df)) will also do
#1 2 3 4 5 6
#1 1 1 2 2 1
可能是这样的:
sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)