在R中通过函数将列中的字符串替换为数字字符

3

我一直在尝试编写一个R函数,可以通过数字替换特定列中的字符串。以下是我的示例:

d <- data.frame(A = c("D",1,2,3,"D",1,2,"B","D",3,5),
                  B = c(7,8,9,4,5,8,9,1,6,7,8))
func <- function(dat,rep_val_col,rep_val_col_change,new_val)
{
  dat[dat[,rep_val_col] == rep_val_col_change[1],],rep_val_col] = new_val[1]
  dat[dat[,rep_val_col] == rep_val_col_change[2],],rep_val_col] = new_val[2]
}

func(d,"A",c("D","B"),new_val = c(9,10))

我希望将A列中的"D"替换为9,将"B"替换为10。

6个回答

2
levels(d$A)[levels(d$A) %in% c("B", "D")] <- c(9, 10)
d$A <- as.numeric(as.character(d$A))

谢谢。它起作用了,我已经修改了函数并且完美地运行了。 code func <- function(dat,rep_val_col,rep_val_col_change,new_val) { levels(dat[,rep_val_col])[levels(dat[,rep_val_col]) %in% rep_val_col_change] <- new_val dat[,rep_val_col] <- as.numeric(as.character(dat[,rep_val_col])) return(dat) }func(d,"A",c("D","B"),new_val = c(9,10)) code - Sana Ali

2
我们可以使用 tidyverse 来完成这个任务。
library(dplyr)
d %>%
     mutate(A = case_when(A =="D" ~"9",
                          A=="B" ~ "10",
                         TRUE ~as.character(A)), 
           A = as.integer(A))    #    A B
#1   9 7
#2   1 8
#3   2 9
#4   3 4
#5   9 5
#6   1 8
#7   2 9
#8  10 1
#9   9 6
#10  3 7
#11  5 8

0

您可以使用嵌套的ifelse()函数:

d$A <- with(d, ifelse(A == "D", 9, ifelse(A == "B", 10, A)))

> d
    A B
1   9 7
2   1 8
3   2 9
4   3 4
5   9 5
6   1 8
7   2 9
8  10 1
9   9 6
10  3 7
11  4 8

0

由于您有一个因子变量,您可以通过以下方式更改此因子的级别:

 func <- function(dat,rep_val_col,rep_val_col_change,new_val)
 {
    levels(dat[,rep_val_col])[levels(dat[,rep_val_col]) == rep_val_col_change[1]] <- new_val[1]
    levels(dat[,rep_val_col])[levels(dat[,rep_val_col]) == rep_val_col_change[2]] <- new_val[2]
    return(dat)
 }

 func(d,"A",c("D","B"),new_val = c(9,10))

这个程序只会在 D 和 B 的位置添加 NAs。 - Sana Ali
真的吗?不过对我来说似乎运行得很好。我得到的结果是 [1] 9 1 2 3 9 1 2 10 9 3 5,列A的级别为:1 2 3 5 10 9。 - theSZ

0

不确定您是否在寻找一般性的东西,但是您可以使用简单的替换来实现

d$A <- gsub("D", 9, d$A)
d$A <- gsub("B", 10, d$A)

0
首先,需要注意的是在一列中同时包含字符串和数值类型的数据将自动将整个列转换为factor(或在某些情况下是character)。
然而,在这种情况下,拥有一个factor实际上是有用的,因为factor会将唯一的值作为levels进行跟踪,我们可以使用matchreplace来更改它们。
首先,检查d$Alevels
levels(d$A)
[1] "1" "2" "3" "5" "B" "D"

我们可以使用match来找到"B"和"D"的索引:
match(c('D','B'), levels(d$A))
[1] 6 5

并使用replace替换它们:

replace(levels(d$A), match(c('D','B'), levels(d$A)), c(9, 10))
[1] "1"  "2"  "3"  "5"  "10" "9" 

请注意,这些水平仍然是类型为character。保存新的水平并将d$A转换为数字:
levels(d$A) <- replace(levels(d$A), match(c('D','B'), levels(d$A)), c(9, 10))
d$A <- as.numeric(as.character(d$A))

感谢您的解释。它也解释了Adam的答案。 - Sana Ali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接