在R中使用数据帧列表中的gsub

时间:2014-11-26 15:56:53

标签: r

示例数据:

df1 <- data.frame(name1=c("nd:f","nd:i","nd:c","nd:g","b:rd"),name2=c("21-12-2001","name","-",15,"-"))
df2 <- data.frame(name1=c("nd:i","nd:c","nd:g","nd:y","a:nd"),name2=c("11-01-2001","name",3,"-","-"))
lt <- list(df1,df2)

如何删除列表中给定固定间隔的"-"符号name2?:

df1$name2[2:3] # for elements 2:3 use gsub("-","",x)

并将更正的(gsub)值存储回lt列表。

1 个答案:

答案 0 :(得分:3)

也许您可以尝试以下内容:

lapply(rapply(lt, function(x) 
  gsub("^-$", "", x), how = "list"), 
  as.data.frame)
# [[1]]
#   name1      name2
# 1  nd:f 21-12-2001
# 2  nd:i       name
# 3  nd:c           
# 4  nd:g         15
# 5  b:rd           
# 
# [[2]]
#   name1      name2
# 1  nd:i 11-01-2001
# 2  nd:c       name
# 3  nd:g          3
# 4  nd:y           
# 5  a:nd           

尽管rapply可以将数据保持为list,但data.frame属性仍然丢失(因此额外的lapply(..., as.data.frame)

"^_$"中使用gsub作为我们的模式,我们会说要找到那种模式。日期不会受到影响。


或许更好的选择是将"-"转换为NA。为此,您可以从my makemeNA function尝试my "SOfun" package

要使用这种方法,您只需执行以下操作:

library(SOfun)
lapply(lt, makemeNA, "-")
# [[1]]
#   name1      name2
# 1  nd:f 21-12-2001
# 2  nd:i       name
# 3  nd:c       <NA>
# 4  nd:g         15
# 5  b:rd       <NA>
# 
# [[2]]
#   name1      name2
# 1  nd:i 11-01-2001
# 2  nd:c       name
# 3  nd:g          3
# 4  nd:y       <NA>
# 5  a:nd       <NA>