R.问题排除“问题排除”#姓名;(从excel导入)在dataframe中
我有一个从excel导入的.csv,其中有我正在尝试删除的公式挂起。 下面是数据的简单版本R.问题排除“问题排除”#姓名;(从excel导入)在dataframe中,r,dataframe,excel-import,R,Dataframe,Excel Import,我有一个从excel导入的.csv,其中有我正在尝试删除的公式挂起。 下面是数据的简单版本 library(tidyverse) df <- data.frame( species = letters[1:5], param1 = c("Place", "creek", "river", "#VALUE!", "desert"), param2 = c(-23.8, 43.23,
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)
库(tidyverse)
df您正在进行精确匹配(而不是正则表达式匹配),因此不需要以不同方式转义特殊变量(如?
,!
)。尝试:
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
df[df==“#VALUE!”]您正在进行精确匹配(而不是正则表达式匹配),因此不需要以不同方式转义特殊变量(如?
,!
)。尝试:
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
df[df==“#VALUE!”]这里有一个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的启发):
这里有一个带有sub
的dplyr
解决方案,可以一次性替换不需要的值:
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的启发):
我懂了。先前的一次尝试抛出了有关?
的错误,因此这就是我走上这条道路的原因。如果我没记错的话,NA
以后也会有问题。是否有一种优雅的方法将其保留为空?在R中,列只能有一种类型将其设置为空会将其更改为字符而不是数字。我在excel工作表参数中有空白单元格,这些单元格为空,并在参数列中显示为空。例如,param3[2]可能为空,只要该列没有以字符串开头,param3仍将显示为classnumeric
。我不确定我是否理解这种情况的区别。对不起,我不理解你的问题。您可以使用class(df$param2)
了解任何列的类。运行我的答案中的代码后,您可以再次检查该类,看看它是否按预期更改。可以导入param3(例如,df我明白了。先前的一次尝试抛出了有关?
的错误,因此这就是引导我走上这条道路的原因。如果我回忆正确,NA
以后也会成为一个问题。是否有一种优雅的方法将其保留为空?在R中,列只能有一种类型将其变为空将其更改为字符而不是数字。I h将excel工作表参数中的空白单元格保留为空白,并在参数列中显示为空白。例如,param3[2]可能为空,并且只要该列不是以字符串开头,param3仍将显示为classnumeric
。我不确定我是否理解这种情况下的区别。抱歉,我不理解您的问题。您可以使用class(df$param2)
了解任何列的类。运行我的答案中的代码后,您可以再次检查类,看看它是否按预期更改。可以导入param3(例如df