首页 > 解决方案 > 在 R 中使用 ifelse 创建列

问题描述

我有点坚持在下面的数据集中创建一个新的图层列:

> head(Sites.merge)
     Echo_ID                 Layer Interval Lat_M         Lon_M          Target_depth_mean Depth_mean ADens
[1,] "20180919_PS-1105_BN_1" "0"   "14"     "26.28209994" "-97.04343251" "0"               " "        "0"  
[2,] "20180919_PS-1105_BN_1" "0"   "15"     "26.28205407" "-97.04343251" "0"               " "        "0"  
[3,] "20180919_PS-1105_BN_1" "0"   "16"     "26.2820098"  "-97.04343558" "0"               " "        "0"  
[4,] "20180919_PS-1105_BN_1" "0"   "17"     "26.28196587" "-97.04344517" "0"               " "        "0"  
[5,] "20180919_PS-1105_BN_1" "0"   "18"     "26.28192194" "-97.04346068" "0"               " "        "0"  
[6,] "20180919_PS-1105_BN_1" "0"   "19"     "26.28187837" "-97.04346667" "0"               " "        "0"  
 Echo_ID_Layer                   numID sum                Echo_max_depth_m S_type       DepthZone  
[1,] "20180919_PS-1105_BN_1_Layer_0" "1"   "13.4396280406658" "16.79"          "Artificial" "Nearshore"
[2,] "20180919_PS-1105_BN_1_Layer_0" "1"   "13.4396280406658" "16.79"          "Artificial" "Nearshore"
[3,] "20180919_PS-1105_BN_1_Layer_0" "1"   "13.4396280406658" "16.79"          "Artificial" "Nearshore"
[4,] "20180919_PS-1105_BN_1_Layer_0" "1"   "13.4396280406658" "16.79"          "Artificial" "Nearshore"
[5,] "20180919_PS-1105_BN_1_Layer_0" "1"   "13.4396280406658" "16.79"          "Artificial" "Nearshore"
[6,] "20180919_PS-1105_BN_1_Layer_0" "1"   "13.4396280406658" "16.79"          "Artificial" "Nearshore"
 Subregion midLayer school.depth newLayer schoolLayer
[1,] "South"   "1.679"  " "          "1"      " "        
[2,] "South"   "1.679"  " "          "1"      " "        
[3,] "South"   "1.679"  " "          "1"      " "        
[4,] "South"   "1.679"  " "          "1"      " "        
[5,] "South"   "1.679"  " "          "1"      " "        
[6,] "South"   "1.679"  " "          "1"      " "   

当前的“层”列有一些正确的值,但其中大部分是错误的,所以我试图使用我创建的其他列中的值来拼凑一个新的层列:

#the first one doesn't work
Sites.merge$artLayer = ifelse(Sites.merge$Target_depth_mean == 0 & Sites.merge$school.depth == "NA", Sites.merge$Layer, Sites.merge$newLayer)
Sites.merge$schLayer = ifelse(Sites.merge$Depth_mean != "NA", Sites.merge$schoolLayer, Sites.merge$artLayer)
Sites.merge$Layer = ifelse(Sites.merge$S_type == "Artificial", Sites.merge$artLayer, Sites.merge$Layer)

在下面的 ifelse 语句中,“TRUE”语句有效,但“FALSE”语句无效。任何帮助将不胜感激。谢谢!

标签: rif-statement

解决方案


我认为您需要先进行一些数据清理。看起来这Sites.merge是一个矩阵,矩阵只能容纳一个类,因此,你所有的值都变成了字符。先转换成dataframe,如果有string "NA",转换成real NA

Sites.merge <- data.frame(Sites.merge)
Sites.merge[Sites.merge == "NA"] <- NA
Sites.merge <- type.convert(Sites.merge, as.is = TRUE)

然后,您可以使用您的ifelse语句。请记住用于is.na检查NA值。

Sites.merge$artLayer = with(Sites.merge, ifelse(Target_depth_mean == 0 & 
                            is.na(school.depth), Layer, newLayer)
Sites.merge$schLayer = with(Sites.merge, ifelse(!is.na(Depth_mean), 
                            schoolLayer, artLayer)
Sites.merge$Layer = with(Sites.merge, ifelse(S_type == "Artificial", 
                            artLayer, Layer)

推荐阅读