根据字符值查找变量,然后将其转换为数字

时间:2019-01-02 20:36:52

标签: r data-manipulation

我对R很陌生,不知道如何根据其值查找变量,然后将其转换为数字。

我看过How do I change a value coded as "Yes" to a value of 1 in R?Convert data.frame column format from character to factor

这些是我的例子。我基本上是将仅具有“ N”和“ Y”的字符变量分别转换为0和1。在逐一检查了一些变量之后,我想知道是否有解决此问题的更快方法。显然还有其他字符变量没有“ Y” /“ N”,因此我不想只查找所有字符变量并将其转换为数字。如果您有任何想法请告诉我!

我的代码:

df$var3<- ifelse(df$var3=="Y",1,0)
df$var4<- ifelse(df$var4=="Y",1,0)
df$var6<- ifelse(df$var5=="Y",1,0)
df$var7<- ifelse(df$var1=="Y",1,0)

样本df(之前):

n = c(2, 3, 5, 8, 10) 
var1 = c("aa", "bb", "cc", "dd", "ee") 
var2 = c(TRUE, FALSE, TRUE, TRUE, TRUE) 
var3 = c("Y", "N", "Y", NA, "N") 
var4 = c("Y", "N", "Y", NA, "Y") 
var5 = c("aa", "bb", "cc", "dd", "ee") 
var6 = c("Y", "N", "Y", "Y", "N") 
var7 = c("Y", "N", "Y", "N", "N") 
df = data.frame(n, var1, var2, var3,var4,var5,var6,var7) 
df <- data.frame(lapply(df, as.character), stringsAsFactors = FALSE)

样本df(发布,我想要的):

n = c(2, 3, 5, 8, 10) 
var1 = c("aa", "bb", "cc", "dd", "ee") 
var2 = c(TRUE, FALSE, TRUE, TRUE, TRUE) 
var3 = c("1", "0", "1", NA, "0") 
var4 = c("1", "0", "1", NA, "1") 
var5 = c("aa", "bb", "cc", "dd", "ee") 
var6 = c("1", "0", "1", "1", "0") 
var7 = c("1", "0", "1", "0", "0") 
df = data.frame(n, var1, var2, var3,var4,var5,var6,var7) 

2 个答案:

答案 0 :(得分:4)

最简单的选择是(如果我们知道列的索引)子集感兴趣的列,将其转换为逻辑矩阵(==),将其强制转换为二进制(+),然后将其分配回感兴趣的列

i1 <- c(4, 5, 7, 8)
df[i1] <- +(df[i1] == "Y")

如果我们没有索引,必须逐一检查每一列,然后遍历各列,检查它是否为factor并仅具有级别“ N”,“ Y”,然后进行转换逻辑向量,并使用as.integer将其更改为integer

df[] <- lapply(df, function(x) if(is.factor(x) && all(levels(x) %in% c("Y", "N"))) 
                  as.integer(x == "Y") else x)

答案 1 :(得分:0)

以下解决方案可用于R base,而无需加载其他R包:

如果您希望在整个数据框中进行更改,则可以使用以下几行。在此特定情况下使用[elseif]的缺点是,您必须设置[else]值,否则可能会覆盖某些数据。

df[df == 'N'] <- 0
df[df == 'Y'] <- 1