如何在R数据框中查找和替换双引号

问题描述 投票:1回答:3

我有一个看起来像这样的数据框(抱歉,我不能用代码复制实际的数据框,因为双引号没有显示.Vx是变量):

V1, V2, V3, V4
home,   15, "grand",    terminal,
"give", 32, "cuz",  good,
"miles",    5,  "before",   ten,
yes,    45, "sorry,"    fine

问题:我如何能够修复我使用read.csv函数导入的整个数据框的双引号问题,其中删除了所有双引号?

我正在寻找的是与FIND + REPLACE相同的excel或单词:找到双引号,并替换为空。

注意:1)我通过运行is.data.frame()函数确认它是一个数据帧2)实际的数据框有数百列,所以通过每个列并声明它的类型是不可行的3)我尝试使用以下,但它不起作用:as.data.frame(sapply(my_data, function(x) gsub("\"", "", x))) 4)我通过在数据框上测试使用sql确认这不是一个简单的打印问题。它不会在双引号中找到列,除非我使用LIKE而不是=

提前致谢!

7/7/15编辑01:根据@alexforrence的要求,这里是几列的d(put)输出:

billing_first_name billing_last_name billing_company 3 NA 4 Peldi Guilizzoni NA 5 NA 6“James Andrew”Angus NA 7 NA 8 Nova Spivack NA

r quotes gsub
3个回答
0
投票

这是使用dplyrstringr的解决方案。请注意,纯数字列之后将是字符列。从你的描述我不清楚是否有纯数字列。如果有,那么你可能想要单独处理它们,或者之后转换回数字。

require(dplyr)
require(stringr)
df <- data.frame(V1=c("home", "\"give\"", "\"miles\"", "yes"),
           V2=c(15, 32, 5, 45),
           V3=c("\"grand\"", "\"cuz\"", "\"before\"", "\"sorry\""),
           V4=c("terminal", "good", "ten", "fine"))
df
##        V1 V2       V3       V4
## 1    home 15  "grand" terminal
## 2  "give" 32    "cuz"     good
## 3 "miles"  5 "before"      ten
## 4     yes 45  "sorry"     fine

df %>% mutate_each(funs(str_replace_all(., "\"", "")))
##      V1 V2     V3       V4
## 1  home 15  grand terminal
## 2  give 32    cuz     good
## 3 miles  5 before      ten
## 4   yes 45  sorry     fine

0
投票

您可以使用nchar()识别双引号。

a <- ""
nchar(a)==0
[1] TRUE

0
投票

除了上面我遇到了一个非常奇怪的问题。使用这些技巧,我写了这个非常短的程序:

setClass("char.with.deleted.quotes")
setAs("character", "char.with.deleted.quotes", 
      function(from) as.character(gsub('„',"xxx", as.character(from), fixed = TRUE)))


TMP = read.csv2("./test.csv", header=TRUE, sep=";", dec=",",
                colClasses = c("character","char.with.deleted.quotes"))

temp <- gsub('„', "xxx", TMP$Name, fixed=TRUE)
print(temp)

与输出:

> source('test.R')
[1] "This is some „Test" "And another „Test" 
[1] " "
Number               Name
1    X-23 This is some „Test
2 K-33.01  And another „Test

它读取虚拟csv:

Number;Name
X-23;This is some „Test
K-33.01;And another „Test

我的目标是在测试之前摆脱这个双引号。然而,到目前为止这不起作用。这是因为这个双引号。

相反,如果我选择替换字符的不同部分,它可以使用read.csv2和上面的类定义,或者直接使用gsub将其保存到temp变量中。

现在真正奇怪的是以下内容。运行程序后,我手动将两行“temp < - gsub”和“print(temp)”复制到命令行:

> source('test.R')
[1] "This is some „Test" "And another „Test" 
[1] "This is some „Test" "And another „Test" 
[1] " "
Number               Name
1    X-23 This is some „Test
2 K-33.01  And another „Test
> 
> temp <- gsub('„', "xxx", TMP$Name, fixed=TRUE)
> print(temp)
[1] "This is some xxxTest" "And another xxxTest"

这无论出于何种原因都有效,如果我直接修改数据框,它也可以工作:

> TMP$Name <- gsub('„', "xxx", TMP$Name, fixed=TRUE)
> print(TMP)
Number                 Name
1    X-23 This is some xxxTest
2 K-33.01  And another xxxTest

但是如果我在程序中重复此命令并再次运行它,它就不起作用。我真的不知道为什么。

© www.soinside.com 2019 - 2024. All rights reserved.