【发布时间】:2021-09-20 00:21:51
【问题描述】:
R 中我的数据框中的一列有一个方向(左、右、L 或 R)。如果此列中的一行是左或 L,我试图将不同列中同一行中的数字转换为负值。这是我目前写的代码:
for(i in 1:nrow(df)){
if(is.na(df[i,7]==F)){
if(df[i,7]=="Left" | df[i,7]=="L"){
if(is.numeric(df[i,11])==T){
lapply(df[i,11], all.neg)
}
}
}
}
我不断收到以下错误消息:
Error in if (df[i, 7] == "Left" | df[i, 7] == "L") { :
missing value where TRUE/FALSE needed
我试图做 na.pass(df) 以避免在缺失值后停止,并且我包含了 is.na() 的第一个 if 语句,这似乎没有必要。我还检查并确保没有其他值(例如“Null”)未被正确编码为 NA。如果有人知道如何解决此问题,我将不胜感激 - 非常感谢!
这是数据的截图。基本上,如果 LSTOA 方向为左或 L,我需要将所有值更改为负数。 enter image description here
这是数据的头部:
structure(list(`LSTOA Direction` = c("Left", "Left", "Left",
"Right", "Left", "Left"), `Preop PA` = c(NA, "6.5", "13.3", NA,
NA, "11.0"), `1st Erect` = c(NA, NA, "2.8", NA, "7.6", "2.8"),
`6M PO PA` = c(NA_character_, NA_character_, NA_character_,
NA_character_, NA_character_, NA_character_), `1Y PO PA` = c("7.5",
NA, "3.3", "5.5", NA, NA), `2Y PO PA` = c(NA, NA, "0.1",
"5.8", "7.2", "2.5"), `5Y PO PA` = c(NA, NA, NA, "3.9", "4.4",
NA), `10Y PO PA` = c("7.8", NA, NA, "2.6", NA, NA), `15Y PO PA` = c(NA,
NA, NA, "3.2", NA, NA)), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
【问题讨论】:
-
嗨,我认为使用
dplyr可以更轻松地实现这一点。您能否提供一个可重复的输入和输出示例 - 它会让其他人更容易帮助您。谢谢。 -
您要查找的
dplyr包中的函数是case_when。查看它的文档,看看是否有帮助! -
(1) 在
if中,不要使用|(单管),除非你将它包裹在any或all中,否则你的if条件不正确。在if中,条件的长度必须始终为 1。其他任何事情都会导致您看到的错误(如果是NA或NULL)或the condition has length > 1 ...。 (2) 拥有样本数据和预期输出将大有帮助。请参阅stackoverflow.com/q/5963269、minimal reproducible example 和 stackoverflow.com/tags/r/info
标签: r dataframe for-loop if-statement na