[英]R scripting Error { : missing value where TRUE/FALSE needed on Dataframe
I have a Data Frame which looks like this 我有一个看起来像这样的数据框
Name Surname Country Path
John Snow UK /Home/drive/John
BOB Anderson /Home/drive/BOB
Tim David UK /Home/drive/Tim
Wayne Green UK /Home/drive/Wayne
I have written a script which first checks if country =="UK"
, if true, changes Path from "/Home/drive/"
to "/Server/files/"
using gsub
in R. 我编写了一个脚本,该脚本首先检查
country =="UK"
是否为true,如果使用R中的gsub
将Path从"/Home/drive/"
更改为"/Server/files/"
。
Script 脚本
Pattern<-"/Home/drive/"
Replacement<- "/Server/files/"
for (i in 1:nrow(gs_catalog_Staging_123))
{
if( gs_catalog_Staging_123$country[i] == "UK" && !is.na(gs_catalog_Staging_123$country[i]))
{
gs_catalog_Staging_123$Path<- gsub(Pattern , Replacement , gs_catalog_Staging_123$Path,ignore.case=T)
}
}
The output i get : 我得到的输出:
Name Surname Country Path
John Snow UK /Server/files/John
*BOB Anderson /Server/files/BOB*
Tim David UK /Server/files/Tim
Wayne Green UK /Server/files/Wayne
The output I want 我想要的输出
Name Surname Country Path
John Snow UK /Server/files/John
BOB Anderson /Home/drive/BOB
Tim David UK /Server/files/Tim
Wayne Green UK /Server/files/Wayne
As we can clearly see gsub fails to recognize missing values and appends that row as well. 正如我们可以清楚地看到的那样,gsub无法识别丢失的值,也无法追加该行。
Many R functions are vectorized, so we can avoid a loop here. 许多R函数是矢量化的,因此我们可以在这里避免循环。
# example data
df <- data.frame(
name = c("John", "Bob", "Tim", "Wayne"),
surname = c("Snow", "Ander", "David", "Green"),
country = c("UK", "", "UK", "UK"),
path = paste0("/Home/drive/", c("John", "Bob", "Tim", "Wayne")),
stringsAsFactors = FALSE
)
# fix the path
df$newpath <- ifelse(df$country=="UK" & !is.na(df$country),
gsub("/Home/drive/", "/Server/files/", df$path),
df$path)
# view result
df
name surname country path newpath
1 John Snow UK /Home/drive/John /Server/files/John
2 Bob Ander /Home/drive/Bob /Home/drive/Bob
3 Tim David UK /Home/drive/Tim /Server/files/Tim
4 Wayne Green UK /Home/drive/Wayne /Server/files/Wayne
In fact, this is the issue with your code. 实际上,这就是您的代码的问题。 Each time through your loop, you check row
i
but then you do a full replacement of the whole column. 每次循环时,您都检查第
i
行,但是然后完全替换整个列。 A fix would be to add [i]
at appropriate places of your final line of code: 一种解决方法是在最终代码行的适当位置添加
[i]
:
gs_catalog_Staging_123$Path[i] <- gsub(Pattern , Replacement , gs_catalog_Staging_123$Path[i] ,ignore.case=T)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.