【问题标题】:Renaming multiple cells in a data frame in R at once一次重命名R中数据框中的多个单元格
【发布时间】:2021-04-07 01:05:59
【问题描述】:

我想根据地区对英国的每个警察局进行分组,但是作为新手,我不知道如何一次重命名多个元素。

示例: How it currently looks like

雅芳和萨默塞特、多塞特、格洛斯特和威尔特郡的警察局位于西南部。 我需要一个将警察局重命名为“西南”上方的函数。

我会在我从英国警方网站下载的原始 csv 数据集中执行此操作,但是我的分析范围从 2019 年 1 月到 2020 年 11 月,并且每个 csv 数据集只能按月、按地区下载(总共大约 900 个 csv 文件)。

我知道下面的函数可以在数据框中选择单个单元格,但是这个数据集太大了,不可行。

data[row number, col number] <- "South West"

任何建议将不胜感激。 提前感谢您营救了一个新手。

附言我合并了 2019 年和 2020 年每个警察局的每个 csv 数据集,使用

crimedata19_20 <- list.files(path="C:/Users/X/Desktop/Crime data/2019-2020",
                    pattern="*.csv")
crimedata19_20 <- do.call("rbind",lapply(crimedata19_20,FUN=function(files){ read.csv(files)})) 

【问题讨论】:

  • 如何使用data.table,然后使用crimedata19_20[Falls.within %in% c("Avon and Somerset", ..., "...."), Area:="South West"]
  • 我收到以下错误:检查 is.data.table(DT) == TRUE。否则,:= 和 :=(...) 被定义为在 j 中使用,仅一次且以特定方式使用。目前正在尝试找到一种解决方法。

标签: r dataframe rename


【解决方案1】:

使用gsub 可以替换模式。 使用R自带的iris数据集的例子:

iris[49:52, ]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 49          5.3         3.7          1.5         0.2     setosa
# 50          5.0         3.3          1.4         0.2     setosa
# 51          7.0         3.2          4.7         1.4 versicolor
# 52          6.4         3.2          4.5         1.5 versicolor

"Species" 列中的所有"setosa" 替换为"South West"

res <- transform(iris,
          Species=gsub(pattern="setosa", replacement="south West", Species))
res[49:52, ]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 49          5.3         3.7          1.5         0.2 south West
# 50          5.0         3.3          1.4         0.2 south West
# 51          7.0         3.2          4.7         1.4 versicolor
# 52          6.4         3.2          4.5         1.5 versicolor

编辑

您可以使用|(或)分隔多个替换。

res2 <- transform(iris,
                 Species=gsub(pattern="setosa|versicolor", replacement="south West", Species))
res2[49:52, ]
#    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
# 49          5.3         3.7          1.5         0.2 south West
# 50          5.0         3.3          1.4         0.2 south West
# 51          7.0         3.2          4.7         1.4 south West
# 52          6.4         3.2          4.5         1.5 south West

【讨论】:

  • 非常感谢,它有效!知道如何一次重命名更多元素吗?我显然无法使用 c() 重命名多个具有相同名称的警察局。我应该为每个警察局单独运行 gsub 吗? IE。我想将 setosa 和 versicolor 重命名为“South West”
  • 再次感谢,您是救生员。
  • 非常欢迎@Lactuca,请考虑mark answer accepted,祝您编码愉快!
  • 完成了!抱歉,我还是堆栈溢出的新手
【解决方案2】:

使用与 @jay.sf 相同的数据,您可以将唯一值存储在数据框中,然后使用 match() 进行替换:

#Keys
Keys <- data.frame(Species=unique(iris$Species),
                   Replace=c('South','North','East'),stringsAsFactors = F)

看起来像这样:

Keys
     Species Replace
1     setosa   South
2 versicolor   North
3  virginica    East

接下来,替换:

#Replace
iris$Species <- Keys[match(iris$Species,Keys$Species),"Replace"]

输出:

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2   South
2          4.9         3.0          1.4         0.2   South
3          4.7         3.2          1.3         0.2   South
4          4.6         3.1          1.5         0.2   South
5          5.0         3.6          1.4         0.2   South
6          5.4         3.9          1.7         0.4   South

tail(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
145          6.7         3.3          5.7         2.5    East
146          6.7         3.0          5.2         2.3    East
147          6.3         2.5          5.0         1.9    East
148          6.5         3.0          5.2         2.0    East
149          6.2         3.4          5.4         2.3    East
150          5.9         3.0          5.1         1.8    East

【讨论】:

  • 这看起来很有趣,感谢您的提醒!但是我似乎无法正常运行它。更具体地说: Keys
  • @Lactuca 你必须根据你的独特价值观来定义它!
  • 我明白了,但是在 iris 数据集中,您根据它们在数据框上的位置 (a-a1, b-b1,c-c3)。但是在我的情况下,我有 38 个元素不一定按照我希望重命名它们的顺序分布。即: (a, b, a, c, c, b,) 所以在 Replace=c() 参数中,我不知道如何执行类似 c(a1, b1, a1, c1, c1, b1) 的操作。我假设我只能按顺序重命名? c(a1、b1、c1、d1 等)。不确定这是否有意义。
  • @Lactuca 位置无关紧要,因为匹配会自动查找,您只需将要替换的值放在每个唯一值中。
  • 好的,我刚刚运行了它,天哪,这让一切变得更加容易!如果我没有先选择 jay.sf 的答案,我会选择这个作为正确答案。再次感谢您的回答和详尽的解释。
【解决方案3】:

只是为了完成方法

library(data.table)
crimedata19_20 <-data.table(crimedata19_20)
West_cols<-c("name1", "name2", ...)
crimedata19_20[Falls.within %in% West_cols, Area:="South West"]

我不会使用gsub,而是为您的区域创建一个新列。也许您稍后需要有关车站的信息。

【讨论】:

  • 我喜欢这种方法,以后我可能不需要这些电台,但你永远不会知道。我最终使用了这种方法,它绝对是迄今为止“最安全”的一种。非常感谢!
  • 很高兴听到 :) 赞成票将不胜感激,但也许你还不能:)
  • 我试过了,但是会弹出这样的信息:“感谢您的反馈!声望低于 15 人的投票会被记录下来,但不要更改公开显示的帖子得分。”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2020-02-20
  • 2016-12-30
  • 2020-07-19
  • 1970-01-01
相关资源
最近更新 更多