通过数据集

时间:2016-04-27 16:11:28

标签: r

开始,示例数据集:

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#参数时出错,请告诉我。

提前致谢全部!

2 个答案:

答案 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