R 基于其他变量创建新变量

R 基于其他变量创建新变量,r,dataframe,categories,R,Dataframe,Categories,在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.25

在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 
  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
sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)
我想按以下方式添加第四个变量(
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       
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 
  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
sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)

我相信有一个简单的方法可以做到这一点,但我不知道,因为我对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
库(tidyverse)
df%
变异(var4=情况_,当(
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)
df%
当(var1>=0.5~1时,突变(var4=case_),
var2>=0.5~2,
var3>=0.5~3,
对(第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)))
df_测试0.5,2,ifelse(df_测试$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
可能是这样的:

  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 
  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
sapply(apply(df >= .5, 1, which), function(x) if(length(x)) x[1] else 4)

这很有效,谢谢。我想有必要使用
ifelse
来捕捉我的最后一个条件,但当我自己编写它时,它没有起作用。再次感谢@m、 ras
如果其他
不是必需的,
max.col(df>=0.5,ties.method=“first”)+3*(行和(df>=0.5)==0)
应该给出相同的结果output@Jaap谢谢我也会试试的。@Jaap我试过你的建议,效果也很好。但是,我不完全理解脚本的第二部分是做什么的(即
+3*(行和(df>=0.5)==0)
部分)。更具体地说,为什么要使用
3*
函数
rowSums
?你能给我解释一下吗,或者给我指出一个正确的方向,让我能读到更多关于这方面的内容吗?谢谢。@AndreElrico对此表示抱歉。我将确保在下次发布时提供更好的数据。谢谢你的帮助。@Sotos现在可以了什么是
=>
,你是说
=
?是的,这就是我的意思。现在变了。