首页 > 解决方案 > 基于其他值存在的新列

问题描述

我有这个df

Plot <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
Dist <- c(0,0,0,0,0,1,3,4,5,7,8,8,9,10)
df1 <- cbind(Plot, Dist)

我想根据该列创建一个具有不同值的新Dist列。所以最终的 df 看起来像:

Plot <- c(1,2,3,4,5,6,7,8,9,10,11,12,13,14)
Dist <- c(0,0,0,0,0,1,3,4,5,7,8,8,9,10)
Grp1 <- c("CT", "CT", "CT", "CT","CT","INT", "INT","INT", "INT", "EXT", "EXT","EXT", "EXT","EXT")
df2 <- cbind(Plot, Dist,Grp1) 

我尝试了这种方法:

library(dplyr) 

df<-df%>%
  as.data.frame %>%
  group_by(Plot) %>%
  mutate(CT = if(any(Dist == 0), "CENTRE")) %>%
  mutate(CT = if(any(between(Dist, 1,7),"INTER"))) %>%
  mutate(CT = if(any(Dist > 7),"EXT"))

但我得到以下信息:Erreur : ',' inattendu(e) in " mutate(CT = if(any(Dist> 7)

谢谢您的帮助

标签: rdplyr

解决方案


首先,我认为您有一个数据框,使用cbind您正在创建一个矩阵。

df1 <- data.frame(Plot, Dist)

由于每一行都有不同的Plot值,因此您不需要group_by Plot. 你可以case_when像这样使用:

library(dplyr)

df1 %>%
  mutate(CT = case_when(Dist == 0 ~ 'CENTRE', 
                        between(Dist, 1,7)~ "INTER", 
                        Dist > 7 ~ "EXT"))

#   Plot Dist     CT
#1     1    0 CENTRE
#2     2    0 CENTRE
#3     3    0 CENTRE
#4     4    0 CENTRE
#5     5    0 CENTRE
#6     6    1  INTER
#7     7    3  INTER
#8     8    4  INTER
#9     9    5  INTER
#10   10    7  INTER
#11   11    8    EXT
#12   12    8    EXT
#13   13    9    EXT
#14   14   10    EXT

推荐阅读