在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很陌生,因此我无法弄清楚。有关如何执行操作的任何建议?
答案 0 :(得分:2)
鉴于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
答案 1 :(得分:0)
使用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
答案 2 :(得分:0)
如果您提供数据供我们使用,请使用dput()。
但是,也许使用dplyr这样的事情。
df <- df %>%
mutate(var4 = case_when (var1 >= 0.5 ~ 1,
var2 >= 0.5 ~ 2,
var3 >= 0.5 ~ 3,
TRUE ~ 4)
答案 3 :(得分:0)
使用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)))
答案 4 :(得分:0)
可能这样:
sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)