开始,示例数据集:
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"
我没有找到任何可以让我找到行/列中的任何和所有文本的内容?看起来像GREP这样的东西只适用于我所知的特定字符串。我也不确定上述功能的格式是否正确,所以如果我在放置#Contains ANY text#参数时出错,请告诉我。
提前致谢全部!
答案 0 :(得分:3)
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
内的匿名函数。
答案 1 :(得分:0)
这是使用@effel提到的通用函数的方法。
jar