【问题标题】:Replace numeric values with string values用字符串值替换数值
【发布时间】:2019-06-30 17:42:27
【问题描述】:

在数据表中,所有单元格都是数字,我想要做的是将所有数字替换成这样的字符串:

[0,2] 中的数字:用字符串“Bad”替换它们

[3,4] 中的数字:用字符串“Good”替换它们

Numbers > 4 : 用字符串“Excellent”替换它们

这是一个名为“data.active”的原始表的示例:

我的尝试是这样的:

x <- c("churches","resorts","beaches","parks","Theatres",.....)
for(i in x){
  data.active$i <- as.character(data.active$i)
  data.active$i[data.active$i <= 2] <- "Bad"
  data.active$i[data.active$i >2 && data.active$i <=4] <- "Good"
  data.active$i[data.active$i >4] <- "Excellent"
}

但它不起作用。有没有其他方法可以做到这一点?

编辑

这是我的数据集GoogleReviews_Dataset 的链接,这是我如何获得上图中的表格:

library(FactoMineR)
library(factoextra)
data<-read.csv2(file.choose())
data.active <- data[1:10, 4:8]

【问题讨论】:

  • 函数cut 用于将连续数值向量分解为离散因子。您最好发布一个reproducible example,其中包含比“它不起作用”更清晰的细节

标签: r dataframe dataset


【解决方案1】:

您可以使用tidyversemutate-across 组合来设置范围:

library(tidyverse)

df <- tibble(
  x = 1:5, 
  y = c(1L, 2L, 2L, 2L, 3L), 
  z = c(1L,3L, 3L, 3L, 2L),
  a = c(1L, 5L, 6L, 4L, 8L),
  b = c(1L, 3L, 4L, 7L, 1L)
)

df %>% mutate(
  across(
    .cols = everything(),
    .fns = ~ case_when(
      .x <= 2             ~ 'Bad',
      (.x > 3) & (. <= 4) ~ 'Good',
      (.x > 4)            ~ 'Excellent',
      TRUE                ~ as.character(.x)
    )
  )
)

上面的.x 表示正在评估的元素(使用 purrr 风格的功能)。这导致

# A tibble: 5 x 5
  x         y     z     a         b        
  <chr>     <chr> <chr> <chr>     <chr>    
1 Bad       Bad   Bad   Bad       Bad      
2 Bad       Bad   3     Excellent 3        
3 3         Bad   3     Excellent Good     
4 Good      Bad   3     Good      Excellent
5 Excellent 3     Bad   Excellent Bad      

要仅更改选定列,请在.cols 参数中为across 使用选择:

df %>% mutate(
  across(
    .cols = c('a', 'x', 'b'),
    .fns = ~ case_when(
      .x <= 2             ~ 'Bad',
      (.x > 3) & (. <= 4) ~ 'Good',
      (.x > 4)            ~ 'Excellent',
      TRUE                ~ as.character(.x)
    )
  )
)

这会产生

# A tibble: 5 x 5
  x             y     z a         b        
  <chr>     <int> <int> <chr>     <chr>    
1 Bad           1     1 Bad       Bad      
2 Bad           2     3 Excellent 3        
3 3             2     3 Excellent Good     
4 Good          2     3 Good      Excellent
5 Excellent     3     2 Excellent Bad      

【讨论】:

  • 这适用于你在代码中给出的列表,但我的数据集不起作用。我检查了我的表的类型,它是“列表”,就像你的“df”一样,但它不起作用
  • @hamzasaber:好的。创建一个我们可以使用的数据集,我们可以管理修复代码...
  • 这是它给我的一些警告:Messages d'avis : 1: In Ops.factor(beachs, 2.7) : '' 对因素 3 没有意义:在 Ops.factor(beaches, 4.1) 中:'
  • @hamzasaber:啊,我明白了。您的列包含字符,而不是数字。也许在我有. 的地方使用as.numeric(.)
  • as.numeric(.) 确实删除了警告但是,我的整个表格现在都充满了字符串“Excellent”。显然 as.numeric(.) 将所有内容更改为大于 100 的数字,这就是为什么它将值替换为“优秀”的原因,因为使用 as.numeric(.),每个值都大于 4
【解决方案2】:
x<-c('x','y','z')
df[,x] <- lapply(df[,x], function(x) 
                         cut(x ,breaks=c(-Inf,2,4,Inf),labels=c('Bad','Good','Excellent'))))

数据

df<-structure(list(x = 1:5, y = c(1L, 2L, 2L, 2L, 3L), z = c(1L,3L, 3L, 3L, 2L), 
a = c(1L, 5L, 6L, 4L, 8L),b = c(1L, 3L, 4L, 7L, 1L)), 
class = "data.frame", row.names = c(NA, -5L))

【讨论】:

  • 如何访问以字符串而不是字符命名的列,例如:x
猜你喜欢
  • 1970-01-01
  • 2022-12-09
  • 2015-11-28
  • 2016-06-22
  • 2013-03-24
  • 2023-01-05
  • 1970-01-01
  • 2017-07-15
  • 1970-01-01
相关资源
最近更新 更多