带有特殊字符的整洁数据帧

时间:2019-12-25 15:49:10

标签: r dplyr readr

我的csv格式的数据集(可用here)如下: enter image description here

我尝试通过以下文档将数据导入R:

library(tidyverse)
data <- read_csv("<Path to file>\\Sample.csv")

当我尝试使用data$提取列时,出现错误:

Error in gsub(reStrip, "", completions, perl = TRUE) : 
  input string 4 is invalid UTF-8

我的数据的D列同时包含数字和特殊字符*和Pilcrow符号。该列最后一行的数字是66.1,但后跟#。同样,第一列包含*和Pilcrow符号。

我想清除数据,以便对于D列和I列,带有*和Pilcrow符号的行被替换为NA。此外,“ 66.1#”将转换为“ 66.1”。

我想要的表如下: enter image description here

我想知道如何将csv文件导入R并将其清理为R中的所需格式。最好使用tidyverse。

1 个答案:

答案 0 :(得分:1)

这是一个简单的解决方案。

以.txt文件的形式读取文件:

修改1: 由于数据在某些单元格中包含#号,因此您需要包含参数comment.char="",以便R将在其后显示数据(但是仍将其视为注释的开始):

df <- read.table("[Your path]/Sample.txt", 
                   header = T, fill = T, quote="", sep="\t", comment.char="")

与其他人一样,我发现您的列标题非常不切实际,并随意将其更改为字母表的前11个字母(仅出于视觉原因;您将有保留标题的理由):

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))

修改2: 如果您想摆脱数据中的主题标签,将对列D执行此操作:

df[,4] <- gsub(" #", "", df[,4])

如果要删除一系列列中的#,请在该范围内的子集df中使用lapply

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