如何解决如果在 R 编程中任何列为空,如何替换同一行中的“N”
如果任何列为空,如何替换同一行中“GID”列中的字符“N”
DataFile <- extract_tables("new.pdf",pages = c(87),method = "stream",output = "data.frame",guess = TRUE)
DataFrame<-as.data.frame(DataFile)
#removing No. and A# from columns
df2<-subset(DataFrame,Group!="No." & Group!="A#")
输出:
GID ColA ColB
1 2 2
2 3 4
3 5 4
4 6 5
5 6 5
NG1 8
MG2 8 1
MG3 8 1
NG4 8
预期输出:
GID ColA ColB
1 2 2
2 3 4
3 5 4
4 6 5
5 6 5
G1 8 N
MG2 8 1
MG3 8 1
G4 8 N
数据:
df1 <- structure(list(GID = c("1","2","3","4","5","NG1","MG2","MG3","NG4"),ColA = c(2L,3L,5L,6L,8L,8L),ColB = c("2","","1","")),row.names = c(NA,-9L),class = "data.frame")
解决方法
在基础 R 中,您可以尝试以下操作。
首先,确定 ColB
为空字符值的行,并存储在逻辑向量中:
emp_rows <- df1$ColB == ""
然后,删除这些行中 GID
中的“N”:
df1$GID[emp_rows] <- gsub("N","",df1$GID[emp_rows])
并将“N”存储在 ColB
的相同行中:
df1$ColB[emp_rows] <- "N"
要概括任何空白列,您可以执行以下操作。根据注释中的逻辑,首先检查 GID
是否以“N”开头。如果是,删除“N”,然后检查所有列是否为空值,如果为空,则替换为“N”。
您可以创建一个函数来执行此操作,然后使用 apply
或其他方法按行遍历您的数据框。
my_fun <- function(vec) {
if (startsWith(vec[["GID"]],"N")) {
vec[["GID"]] <- gsub("N",vec[["GID"]])
vec <- replace(vec,vec == "","N")
}
return(vec)
}
data.frame(t(apply(df1,1,my_fun)))
输出
GID ColA ColB
1 1 2 2
2 2 3 4
3 3 5 4
4 4 6 5
5 5 6 5
6 G1 8 N
7 MG2 8 1
8 MG3 8 1
9 G4 8 N
,
通过这种方式,如果您选择不提及列名,您可以用 N 或任何其他字符替换空字符
library(tidyverse)
df1 <- structure(list(GID = c("1","2","3","4","5","NG1","MG2","MG3","NG4"),ColA = c(2L,3L,5L,6L,8L,8L),ColB = c("2","1","")),row.names = c(NA,-9L),class = "data.frame")
df1 %>%
mutate(across(everything(),~str_replace(.,"^$","N")),GID = GID %>% str_remove("N"))
#> GID ColA ColB
#> 1 1 2 2
#> 2 2 3 4
#> 3 3 5 4
#> 4 4 6 5
#> 5 5 6 5
#> 6 G1 8 N
#> 7 MG2 8 1
#> 8 MG3 8 1
#> 9 G4 8 N
由 reprex package (v0.3.0) 于 2021 年 2 月 5 日创建
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。