0

我有一个从 excel 导入的 .csv 文件,其中包含我要删除的公式挂断。数据的简单版本如下。

library(tidyverse)
df <- data.frame(
  species = letters[1:5],
  param1 = c("Place", "creek", "river", "#VALUE!", "desert"),
  param2 = c(-23.8, 43.23, "#NAME?", 45, 0.23),
  param3 = c(2.4, 2, 5.7, 0.00003, -2.5),
  stringsAsFactors = FALSE
) # This is a simplified version of the excel .csv import

df[df == "#VALUE!"] <- ""     # Removes excel cells where the formula left "#VALUE!"
df[df == "#NAME\\?"] <- ""   # This does not work

ndf <- df  # This is an attempt to reassign the columns to numeric
ndf
class(ndf$param2)
class(ndf$param3)

主要的问题是,Param2剩下的数据列在需要时分配给characternumeric,或者我必须在其上运行的功能不起作用。

我尝试了很多不同的东西,但是我似乎总是什么都认不出这个细胞。如何删除“#NAME”?请穿过df?

4

2 回答 2

2

您正在进行完全匹配(而不是正则表达式匹配),因此您不需要以不同的方式转义特殊变量(如?, !)。尝试 :

df[df == "#VALUE!"] <- ""  
df[df == "#NAME?"] <- NA
df <- type.convert(df, as.is = TRUE)
df
#  species param1 param2   param3
#1       a  Place -23.80  2.40000
#2       b  creek  43.23  2.00000
#3       c  river     NA  5.70000
#4       d         45.00  0.00003
#5       e desert   0.23 -2.50000

str(df)
#'data.frame':  5 obs. of  4 variables:
# $ species: chr  "a" "b" "c" "d" ...
# $ param1 : chr  "Place" "creek" "river" "" ...
# $ param2 : num  -23.8 43.23 NA 45 0.23
# $ param3 : num  2.4 2 5.7 0.00003 -2.5
于 2021-05-13T06:36:36.477 回答
0

这是一次性替换不需要的值的dplyr解决方案:sub

df %>%
  mutate(across(matches("\\d"), ~sub("#.*", "NA", .)))
  species param1 param2 param3
1       a  Place  -23.8    2.4
2       b  creek  43.23      2
3       c  river     NA    5.7
4       d     NA     45  3e-05
5       e desert   0.23   -2.5

如果您不知道不需要的值出现在哪些列中,此解决方案会很有帮助:

library(stringr)
df %>% 
  mutate(across(where(~any(str_detect(.,"#"))), ~sub("#.*", "NA", .)))

这第三个解决方案既替换了任何地方不需要的值,又将列转换为正确的类型(感谢@Ronak 的启发):

df %>% 
  mutate(across(where(~any(str_detect(.,"#"))), ~sub("#.*", "NA", .)),
         across(everything(), ~type.convert(., as.is = TRUE)))
于 2021-05-14T08:01:25.503 回答