r - 在 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”语句无效。任何帮助将不胜感激。谢谢!
解决方案
我认为您需要先进行一些数据清理。看起来这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)
推荐阅读
- mysql - 使用 MySQL 透视列值和标记
- python - 如何仅从 Python 列表中获取不是字符串的元素?
- excel - 如何使用 office-js-helpers 在 .NET Core 2.2 上使用 IdentityServer4 对 Excel Web 插件进行身份验证
- kubernetes - 在 istio 1.2.5 中创建 istio 入口网关时出错
- java - 如何将我的活动类文件发送到我的处理程序类文件编辑文本值
- reactjs - 从子中获得价值
- c++ - how to make compiz like page transition
- reactjs - Passing value from Children component to a Parent Component in React when Routing happens
- alexa - How can I reprompt the question for a slot if I only want synonyms
- bash - Azure SQL 何时准备好接收查询?