首先,示例数据集:
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))