R 基于其他变量创建新变量
在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
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现在可以了什么是=>
,你是说=
?是的,这就是我的意思。现在变了。