将函数应用于R中的字符帧

将函数应用于R中的字符帧,r,frame,apply,R,Frame,Apply,我有一组变量,这些变量是我试图通过创建以下函数并使用apply()函数将其转换为二进制的字符: a <- as.factor(c("n/a", "False", "False", "True")) b <- as.factor(c("n/a", "True", "False", "True")) y <- data.frame(a,b) conv <- function(x){ levels(x)[which(levels(x)=="n/a")] <-

我有一组变量,这些变量是我试图通过创建以下函数并使用
apply()
函数将其转换为二进制的字符:

a <- as.factor(c("n/a", "False", "False", "True"))
b <- as.factor(c("n/a", "True", "False", "True"))
y <- data.frame(a,b)


conv <- function(x){
    levels(x)[which(levels(x)=="n/a")] <- NA
    levels(x)[which(levels(x)=="False")] <- 0
    levels(x)[which(levels(x)=="True")] <- 1
    x <- as.numeric(levels(x))[x]
    return(x)
}

apply(y,2, conv)
预期产出应为:

y:
NA NA
0 1
0 0 
1 1

你有没有想过为什么会这样?谢谢。

R
中,逻辑值为真/假,而不是字符串“真”、“假”。此外,
NA
是缺少的值

y[] <- NA^(is.na(replace(as.matrix(y), y=="n/a", NA)))*+(y=='True')
y
#   a  b
#1 NA NA
#2  0  1
#3  0  0
#4  1  1

y[]在
R
中,逻辑值为真/假,而不是字符串“真”、“假”。此外,
NA
是缺少的值

y[] <- NA^(is.na(replace(as.matrix(y), y=="n/a", NA)))*+(y=='True')
y
#   a  b
#1 NA NA
#2  0  1
#3  0  0
#4  1  1

y[]您的函数很好,只需使用
lappy

conv <- function(x){
    levels(x)[which(levels(x)=="n/a")] <- NA
    levels(x)[which(levels(x)=="False")] <- 0
    levels(x)[which(levels(x)=="True")] <- 1
    x <- as.numeric(levels(x))[x]
    return(x)
}

lapply(y,conv)

conv您的功能很好,只需使用
lappy

conv <- function(x){
    levels(x)[which(levels(x)=="n/a")] <- NA
    levels(x)[which(levels(x)=="False")] <- 0
    levels(x)[which(levels(x)=="True")] <- 1
    x <- as.numeric(levels(x))[x]
    return(x)
}

lapply(y,conv)

conv一个简单的
ifelse
可以满足
NA
需求<然后可以使用code>grepl
转换为0/1,即

y[] <- lapply(y[], function(i) ifelse(i == 'n/a', NA, grepl('True', i)*1))
y
#   a  b
#1 NA NA
#2  0  1
#3  0  0
#4  1  1

y[]一个简单的
ifelse
可以满足
NA
需求<然后可以使用code>grepl
转换为0/1,即

y[] <- lapply(y[], function(i) ifelse(i == 'n/a', NA, grepl('True', i)*1))
y
#   a  b
#1 NA NA
#2  0  1
#3  0  0
#4  1  1

y[]你能显示你的预期输出吗?@akrun我刚把它添加到帖子中。你的功能很好,用
lappy
代替
apply
。你能显示你的预期输出吗?@akrun我刚把它添加到帖子中。你的功能很好,使用
lappy
而不是
apply
。如何将n/a保留为
NA
?使用此代码,它们被转换为0@coding_heart如果您查看第一行,它是NA。@coding\u heart如果您想更新原始数据集,请指定它,即<代码>y[]您如何将n/a保留为
NA
?使用此代码,它们被转换为0@coding_heart如果您查看第一行,它是NA。@coding\u heart如果您想更新原始数据集,请指定它,即<代码>y[]