通过R中的函数用列中的数字字符替换字符串

时间:2017-06-01 08:26:15

标签: r string function numeric

我一直在尝试在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))

我想替换&#34; D&#34;和&#34; B&#34;在A栏中分别为9和10。

6 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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

答案 2 :(得分: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))

答案 3 :(得分:0)

不确定您是否正在寻找一般情况,但您可以使用

进行简单的替换
d$A <- gsub("D", 9, d$A)
d$A <- gsub("B", 10, d$A)

答案 4 :(得分:0)

首先请注意,在列中混合使用字符串和数值会自动将整列转换为factor(或某些情况下为character)。

但是,在这种情况下,factor实际上有factor作为levels跟踪我们可以使用match和{{replace更改d$A的唯一值。 1}}。

首先,检查levels(d$A) [1] "1" "2" "3" "5" "B" "D"

的级别
match

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

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)) 转换为数字:

long pageId = appPagesRepository.findByPageEntry("Начальный экран справки");

答案 5 :(得分:0)

我们可以使用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