通过R中的函数用列中的数字字符替换字符串
replacing string with numeric character in a column through function in R
我一直在尝试在 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" 和 "B" 分别替换为 9 和 10。
levels(d$A)[levels(d$A) %in% c("B", "D")] <- c(9, 10)
d$A <- as.numeric(as.character(d$A))
您可以使用嵌套 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
因为你有一个因子变量,你可以通过
改变这个因子的水平
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$A <- gsub("D", 9, d$A)
d$A <- gsub("B", 10, d$A)
首先,请注意,在一列中混合使用字符串和数值会自动将整列转换为 factor
(或在某些情况下为 character
)。
然而,在这种情况下,factor
实际上很有用,因为 factor
跟踪唯一值 levels
,我们可以使用 match
和replace
.
首先,检查d$A
的等级:
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))
我们可以用 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
我一直在尝试在 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" 和 "B" 分别替换为 9 和 10。
levels(d$A)[levels(d$A) %in% c("B", "D")] <- c(9, 10)
d$A <- as.numeric(as.character(d$A))
您可以使用嵌套 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
因为你有一个因子变量,你可以通过
改变这个因子的水平 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$A <- gsub("D", 9, d$A)
d$A <- gsub("B", 10, d$A)
首先,请注意,在一列中混合使用字符串和数值会自动将整列转换为 factor
(或在某些情况下为 character
)。
然而,在这种情况下,factor
实际上很有用,因为 factor
跟踪唯一值 levels
,我们可以使用 match
和replace
.
首先,检查d$A
的等级:
levels(d$A)
[1] "1" "2" "3" "5" "B" "D"
然后我们可以使用 match
:
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))
我们可以用 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