将字符响应转换为数据集上的"N"



首先,示例数据集:

x <- data.frame(v1=1:5,v2=1:5,v3=1:5,
v4=c("Bob","Green","Curley","Banana","No"), 
v5=c("Hello","This question is awful, Mad",NA,"Help","Me"))

我有一个大型数据集,其中包含大量数字和字符变量(调查数据)。这些答复的内容和长度差异很大;这些变量在物质中的顺序也是如此。 我正在尝试找到一种方法来选择数据集中的所有字符变量,然后将任何响应设置为字母"N"/"另一个项目"(同时保持 NA 值不变)。

在社区中其他用户的帮助下,我能够用 NA 或"N"等填充所有这些字符变量:

x[,sapply(x, is.character)] <- "N"

但是,我真的很希望能够保留数据中存在的那些 NA 值 - 像这样的东西(我还不太精通应用功能):

x[ #Contains ANY Text# ,sapply(x, is.character)] <- "NA" 

我还没有找到任何可以让我在行/列中找到任何和所有文本的东西?据我所知,它似乎仅适用于特定的字符串。 我也不确定我使用上述函数的格式是否正确,因此如果我在放置 #Contains ANY text# 参数时出错,请告诉我。

提前感谢大家!

data.frame是一个列表,因此可以使用lapply更改其列。

在这里,我们可以x子集到字符列,然后lapply它们将非 NA 值替换为我们想要的任何值。

x <- data.frame(v1=1:5,v2=1:5,v3=1:5,
                v4=c("Bob","Green","Curley","Banana","No"), 
                v5=c("Hello","This question is awful, Mad",NA,"Help","Me"),
                stringsAsFactors = FALSE) # your original data.frame had factors
x
#   v1 v2 v3     v4                          v5
# 1  1  1  1    Bob                       Hello
# 2  2  2  2  Green This question is awful, Mad
# 3  3  3  3 Curley                        <NA>
# 4  4  4  4 Banana                        Help
# 5  5  5  5     No                          Me
is_char_col <- sapply(x, is.character)
is_char_col
#    v1    v2    v3    v4    v5 
# FALSE FALSE FALSE  TRUE  TRUE 

使用replace

x[is_char_col] <- lapply(x[is_char_col], function(k) replace(k, !is.na(k), "N"))
x
#   v1 v2 v3 v4   v5
# 1  1  1  1  N    N
# 2  2  2  2  N    N
# 3  3  3  3  N <NA>
# 4  4  4  4  N    N
# 5  5  5  5  N    N

如果替换逻辑实际上更复杂,则可以修改 lapply 中的匿名函数。

这是一个使用 @effel 提到的泛型函数的方法。

x <- data.frame(v1=1:5,v2=1:5,v3=1:5,
            v4=c("Bob","Green","Curley","Banana","No"), 
            v5=c("Hello","This question is awful, Mad",NA,"Help","Me"),
            stringsAsFactors = FALSE)
x <- data.frame(lapply(x, function(i) if(is.character(i)) ifelse(!is.na(i), "N", i) else i))

最新更新