gpt4 book ai didi

r - 在 R 中查找并替换多列中的值

转载 作者:行者123 更新时间:2023-12-02 11:38:19 26 4
gpt4 key购买 nike

我有一个导入到 R 中的数据框,其中包含大约 180 列和 1000 strip 有字符串值的记录。这些字符串可以是单个单词或单词组合,例如(“Good”、“Very good”)。它们有特殊字符,如撇号,例如(“不知道”)。

我正在尝试查找多列中的特定字符串值并将其替换为数字,以便我可以处理它们。

我已将感兴趣的列存储到一个变量中,这样我就不必一次又一次提及这些名称。数据集中的名称太长并且有很多“.”。在他们中。

提供了可重现的代码作为示例。

set.seed(12)
datwe <- data.frame(replicate(37,sample(c("ABC’o /BBB","XYZ","FoO","ABC'o /BBB",NA),10,rep=TRUE)))

> str(datwe)
'data.frame': 10 obs. of 37 variables:
$ X1 : Factor w/ 3 levels "ABC'o /BBB","ABC’o /BBB",..: 2 NA NA 3 2 2 2 1 2 2
$ X2 : Factor w/ 4 levels "ABC'o /BBB","ABC’o /BBB",..: 4 NA 4 4 4 3 3 3 1 2
$ X3 : Factor w/ 4 levels "ABC'o /BBB","ABC’o /BBB",..: 4 1 2 1 4 4 3 2 3 1
$ X4 : Factor w/ 2 levels "ABC'o /BBB","XYZ": 2 NA NA NA 1 NA 1 NA 2 2

Please note, "ABC'o /BBB","ABC’o /BBB" are not same even though they can be read the same.

感兴趣的列位于 v

v=c(names(datwe[3:6]),names(datwe[9]),names(datwe[12]))

我想用 -100 替换“ABC'o/BBB”,用 4 替换“FoO”,用 5 替换“XYZ”。v 中的这些列和其他列在实际数据中也确实具有 NA,必须保留为 NA。我的最终目标是对这些列进行一些总结,找出总和、平均值等。哪些列的平均值比其他列更好。

我已经尝试了下面的代码,它已经部分工作。我已经能够将 F0O 替换为 4,但不能替换“ABC'o/BBB”,因为数据中的 (') 与 R 不匹配,并且它不会选择相关数据。

datwe[v]<- replace(datwe[v],datwe[v]=="FoO","4")
datwe[v]<- replace(datwe[v],datwe[v]=="ABC'o /BBB","-100")

失败了

datwe[grepl("^ABC",datwe[,v],perl=TRUE),datwe[,v]]<-"-100"

我尝试使用 sqldf 进行更新 stmt,但也失败了。

for(mycols in v)
sqldf("update datwe set $mycols='-100' where $mycols like 'AB%'")

请帮忙!

感谢@amrrs 和@Hugh 提供解决方案。我编辑了示例数据以反射(reflect)更接近实际数据的数据。

我按照@amrrs的建议尝试了以下代码

datwe[v] <- lapply(datwe[v],
function(x){ifelse(x=="FoO","4",
ifelse(x=="XYZ","5",
ifelse(x=="ABC'o /BBB","-100",x)))})

但是“ABC'o/BBB”会转换为 2 而不是 -100,无法找到精确匹配。

我认为这个问题是由于 R 和源数据中的引号 (') 不同造成的。

实际数据有不同形式的单引号(Don't,don't)。

我用实际数据尝试了@Hugh提供的解决方案

datwe_melt <-
datwe[, id := .I] %>%
melt.data.table(id.vars = "id")

这工作得很好,并将列创建为变量和正确的值。

datwe_melt_modified<-datwe_melt[decoder, on = "value==old"] %>%
dcast.data.table(id ~ variable, value.var = "new")

dcast 代码给出了以下警告。

Aggregate function missing, defaulting to 'length'

0 替换 NA,1 替换非 NA;并包含一个名为 NA 的新列。解码器来自 Excel 文件。样本数据中的 NA 得到了正确处理,而在实际数据中,它给出了新列和新行。我知道我还没有理解 dcast 来解决它。检查给定的分辨率 here here 但我无法解决我的问题。

我希望有一个有效的解决方案,而不是专门提及所有形式的引号。

有没有办法在 SQL 中给出类似于“AB%”的内容,它应该替换所有以“AB”开头的内容

最佳答案

由于引号,您的 grepl 可能无法正常工作。所以ifelse 应该如此!

    set.seed(12)
datwe <- data.frame(replicate(37,sample(c("ABC'o /BBB","XYZ","FoO"),10,rep=TRUE)))

v=c(names(datwe[3:6]),names(datwe[9]),names(datwe[12]))

datwe[v] <- lapply(datwe[v],function(x){ifelse(x=="ABC'o /BBB",-100,ifelse(x=="FoO",1,ifelse(x=='XYZ',2,x)))})

datwe

关于r - 在 R 中查找并替换多列中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46357584/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com