在 R 中的 for 循环中的 if else 语句中使用 grepl()
Using grepl() within an if else statement within a for loop in R
我正在尝试在 for 循环中的 if else 字符串中使用 grepl() 来做一些我认为在 R 中很常见的事情:我有一列有很长的地块名称,我正在尝试从该绘图列中获取信息并根据该信息生成新列。对于这个例子,我将提供一个版本的数据来解释我的尝试:
for(i in seq_along(data)) {
if(grepl("1987", data$id) == TRUE) {
print("dnr87")
} else if { (grepl("1994", data$id) == TRUE) {
else
print("no id")
}
我收到警告:
the condition has length > 1 and only the first element will be used
我的问题是:
- 我知道以这种方式设计的 if else 语句仅适用于单个对象,但由于我将它嵌套在 for 循环中,它不应该继续将其过程应用于每一行吗?
- 我是否正确使用了 grepl?这难道不应该有效地了解我的目标功能吗?
- 我怎样才能让这些数据输出到我下面名为“plot”的空列中的相应行中?这是我最不担心的,因为如果我能够让它吐出数据,我可以在需要时将数据合并到该列中。
显然,如下面的数据所示,我想设计 for 循环来遍历并分配相同类型的数据,不仅基于年份的 grepl,还基于 ID 的 grepl(例如, grepl("E14) 对于第一个数据点),但我想如果你们都可以帮助我解决前面提到的问题,我应该能够在没有大问题的情况下将其纳入。
数据table(名称:数据)
id stand plot
E141987 NA NA
E141987 NA NA
E141987 NA NA
E141987 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
由于您没有提供可重现的数据来说明该过程,这里有一些模拟数据。如果我对你的理解正确的话,你想根据模式改变代码。如果是这种情况,您可以使用 嵌套的 ifelse 语句:
数据:
df <- data.frame(
id = c("a87", "b87", "abc95", "a95", "x123")
)
现在您使用变异值定义新列:
df$new <- ifelse(grepl("87", df$id), "new1",
ifelse(grepl("95", df$id), "new2", "new3"))
一个 ifelse
子句将三个参数作为输入:(i) 条件,(ii) 如果条件成立,该怎么做,(iii) 如果条件不成立,该怎么做。 (iii) 的执行可以通过插入另一个 ifelse
子句测试第二个条件来延迟。这又可以通过第三个条件等再次延迟。
结果:
df
id new
1 a87 new1
2 b87 new1
3 abc95 new2
4 a95 new2
5 x123 new3
这些不是您的数据,但我猜您明白了要点:不需要 for
循环,您可以将一个 ifelse
嵌套在另一个中。
我正在尝试在 for 循环中的 if else 字符串中使用 grepl() 来做一些我认为在 R 中很常见的事情:我有一列有很长的地块名称,我正在尝试从该绘图列中获取信息并根据该信息生成新列。对于这个例子,我将提供一个版本的数据来解释我的尝试:
for(i in seq_along(data)) {
if(grepl("1987", data$id) == TRUE) {
print("dnr87")
} else if { (grepl("1994", data$id) == TRUE) {
else
print("no id")
}
我收到警告:
the condition has length > 1 and only the first element will be used
我的问题是:
- 我知道以这种方式设计的 if else 语句仅适用于单个对象,但由于我将它嵌套在 for 循环中,它不应该继续将其过程应用于每一行吗?
- 我是否正确使用了 grepl?这难道不应该有效地了解我的目标功能吗?
- 我怎样才能让这些数据输出到我下面名为“plot”的空列中的相应行中?这是我最不担心的,因为如果我能够让它吐出数据,我可以在需要时将数据合并到该列中。
显然,如下面的数据所示,我想设计 for 循环来遍历并分配相同类型的数据,不仅基于年份的 grepl,还基于 ID 的 grepl(例如, grepl("E14) 对于第一个数据点),但我想如果你们都可以帮助我解决前面提到的问题,我应该能够在没有大问题的情况下将其纳入。
数据table(名称:数据)
id stand plot
E141987 NA NA
E141987 NA NA
E141987 NA NA
E141987 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
E121994 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
W52012 NA NA
由于您没有提供可重现的数据来说明该过程,这里有一些模拟数据。如果我对你的理解正确的话,你想根据模式改变代码。如果是这种情况,您可以使用 嵌套的 ifelse 语句:
数据:
df <- data.frame(
id = c("a87", "b87", "abc95", "a95", "x123")
)
现在您使用变异值定义新列:
df$new <- ifelse(grepl("87", df$id), "new1",
ifelse(grepl("95", df$id), "new2", "new3"))
一个 ifelse
子句将三个参数作为输入:(i) 条件,(ii) 如果条件成立,该怎么做,(iii) 如果条件不成立,该怎么做。 (iii) 的执行可以通过插入另一个 ifelse
子句测试第二个条件来延迟。这又可以通过第三个条件等再次延迟。
结果:
df
id new
1 a87 new1
2 b87 new1
3 abc95 new2
4 a95 new2
5 x123 new3
这些不是您的数据,但我猜您明白了要点:不需要 for
循环,您可以将一个 ifelse
嵌套在另一个中。