R 使用特殊字符整理数据帧
我的csv格式数据集(可用)如下所示: 我尝试使用以下文档将数据导入R:R 使用特殊字符整理数据帧,r,dplyr,readr,R,Dplyr,Readr,我的csv格式数据集(可用)如下所示: 我尝试使用以下文档将数据导入R: library(tidyverse) data <- read_csv("<Path to file>\\Sample.csv") 我的数据的D列包含数字和特殊字符*以及皮尔克罗符号。此列最后一行中的数字为66.1,但后跟#。类似地,列I包含*和皮尔克罗符号 我想清理数据,以便对于D列和I列,带*的行和Pilcrow符号替换为NA。此外,“66.1#”转换为“66.1” 我想要的表格如下: 我想知道
library(tidyverse)
data <- read_csv("<Path to file>\\Sample.csv")
我的数据的D列包含数字和特殊字符*以及皮尔克罗符号。此列最后一行中的数字为66.1,但后跟#。类似地,列I包含*和皮尔克罗符号
我想清理数据,以便对于D列和I列,带*的行和Pilcrow符号替换为NA。此外,“66.1#”转换为“66.1”
我想要的表格如下:
我想知道如何将csv文件导入R,并将其清理为R中所需的格式。最好使用tidyverse。这里有一个简单的解决方案 以.txt文件的形式读入文件: 编辑1: 由于数据在某些单元格中包含hashtag#,因此需要包含参数
comment.char=“”
,以便R将在其后面显示数据(但仍将其视为注释的开头):
如果要在一系列列中去掉#,请在该范围上子集df
,并使用lappy
:
df[,c([range])] <- lapply(df[,c([range])], function(x) gsub(" #", "", x))
df[,c([range])]我猜这与任何tidyverse软件包无关,而是使用了非标准(可以说是无效的)列名。首先解决这些问题:删除空格和特殊字符。很多SO帖子已经涵盖了这一点,包括。您最好在问题中创建一个,而不是我们必须下载外部数据。数据是从外部数据库下载的,我有意保留列名。我有很多数据集。如果我可以在R中直接使用它们,而不必为每个数据集重命名列,那么效率会更高。正如我提到的,我更喜欢tidyverse的解决方案,但任何其他解决方案都可以。有了提供的数据,任何人都可以复制我的错误。尽管数据存放在其他地方,但误差无疑是可重复的。此外,提供的数据集是用于复制的最小数据集,这符合可复制示例的精神。THX链接中的CSVhttps://raw.githubusercontent.com/Patricklv/Dataframe-with-special-characters/master/Sample.csv
似乎没有皮尔克罗符号——我在那里看到问号。对于您来说,它看起来不同吗?对于readr::read\u csv(path,col\u names=F)
,值中的pilcrow不是问题。您甚至可以毫无问题地将列名作为文本读入。但到目前为止,我尝试过的命名版本都不允许在生成的数据帧上设置这些名称(setNames
,purr::set_names
,magrittr::set_colnames
)。我关于它不是特定于tidyverse的评论是我删除标记的原因,因为问题与给出的何时使用该标签的指导不匹配。另外,我并不想更改文件中的列名,因为这无论如何都是不好的形式。您说过当您尝试data$
时会出现问题,所以我的意思是在执行类似操作之前先修复列名谢谢Chris。我可以用R中的代码重命名列。您的解决方案解决了将*和pilcrow符号转换为NA的问题。但从E列开始的最后一行中缺少所有值。还有什么想法吗?这一点很重要,因为从数据库下载的数据集中的某些行在D列中的数字后有“#”(在#符号前有空格)。从E列开始的数据丢失,因为E列中的数据字符串以结尾。
!R将该字符理解为注释的开始,它既不被视为数据也不被视为代码。如果删除.txt文件中的字符,则读取完成。如果数据中有许多单元格带有#,则有一个更好的解决方案:查看我的编辑
df <- read.table("[Your path]/Sample.txt",
header = T, fill = T, quote="", sep="\t", comment.char="")
colnames(df) <- LETTERS[1:11]
df
A B C D E F G H I J K
1 Adams County, Nebraska(6,10) 31001 *** 62.1 51.4 74.6 25 stable -5.2 -32.3 32.8
2 Adams County, North Dakota(6,10) 38001 *** * * * 3 or fewer * * * *
3 Aiken County, South Carolina(6,10) 45003 *** 55.9 51.5 60.6 124 stable -2.3 -8.8 4.6
4 Aitkin County, Minnesota(6) 27001 *** ¶ ¶ ¶ ¶ ¶ ¶ ¶ ¶
5 Albemarle County, Virginia(6,10) 51003 *** 49.4 44.1 55.3 64 stable -2.9 -18.1 15.2
6 Alcona County, Michigan(6,10) 26001 *** 66.1 # 51.2 86.7 17 stable -3.6 -26.5 26.3
df[,4] <- gsub("\\*|¶", NA, df[,4])
df[,9] <- gsub("\\*|¶", NA, df[,9])
df[,c(4,9)] <- lapply(df[,c(4,9)], function(x) gsub("\\*|¶", NA, x))
df[,4] <- gsub(" #", "", df[,4])
df[,c([range])] <- lapply(df[,c([range])], function(x) gsub(" #", "", x))
df
A B C D E F G H I J K
1 Adams County, Nebraska(6,10) 31001 *** 62.1 51.4 74.6 25 stable -5.2 -32.3 32.8
2 Adams County, North Dakota(6,10) 38001 *** <NA> * * 3 or fewer * <NA> * *
3 Aiken County, South Carolina(6,10) 45003 *** 55.9 51.5 60.6 124 stable -2.3 -8.8 4.6
4 Aitkin County, Minnesota(6) 27001 *** <NA> ¶ ¶ ¶ ¶ <NA> ¶ ¶
5 Albemarle County, Virginia(6,10) 51003 *** 49.4 44.1 55.3 64 stable -2.9 -18.1 15.2
6 Alcona County, Michigan(6,10) 26001 *** 66.1 51.2 86.7 17 stable -3.6 -26.5 26.3