在保持结构的同时格式化向量的df列。 (R)

时间:2017-04-11 14:50:45

标签: r dataframe

我有一个2列数据框(DF),其中一列包含向量,另一列是字符。

Orig.                    Matched
AbcD  c("ab.d","Acbd","AA.D","")
jKdf  c("JJf.","K.dF","JkD.","")

我的目标是删除所有标点符号(逗号和句点)以及使所有内容都小写。对于字符列来说这很容易,但向量列更具挑战性。

我尝试使用的一些小写方法是

  • lapply(DF, tolower)。这会导致数据帧转换为矩阵。这样做我失去了矢量结构的列。

关于标点符号,我试过

  • gsub("\\.", "", DF)
  • gsub("\\,", "", DF)分别删除句号和逗号。

这会导致数据框转换为字符列表。

我想我的问题如下:

  • 是否有其他方法可以删除标点符号并转换为保留数据框架结构的小写字母?

  • 如果没有,我怎样才能将上述输出转换回原始格式;那是一列向量?

2 个答案:

答案 0 :(得分:0)

我确信还有其他方法可以完成这项工作,但这是一个非常有效的例子:

hello, my word id is 0
2 id 0
hello, my word id is 1
2 id 1
hello, my word id is 2
2 id 2
hello, my word id is 3
2 id 3
hello, my word id is 4
2 id 4
hi, id 3
hi, id 0
hi, id 1
hi, id 2
hi, id 4

数据框只是列表的特殊情况,其中所有元素具有相同的长度,因此强制回来和第四个通常不是问题。

答案 1 :(得分:0)

根据您的描述,听起来您有一些看起来像这样的数据:

mydf <- data.frame(Orig = c("AbcD", "jKdf"),
                   Matched = I(list(c("ab.d","Ac,bd","AA.D",""),
                                    c("JJf.","K.dF","JkD.",""))))

mydf
#   Orig      Matched
# 1 AbcD ab.d, Ac....
# 2 jKdf JJf., K.....

str(mydf)
# 'data.frame': 2 obs. of  2 variables:
#  $ Orig   : Factor w/ 2 levels "AbcD","jKdf": 1 2
#  $ Matched:List of 2
#   ..$ : chr  "ab.d" "Ac,bd" "AA.D" ""
#   ..$ : chr  "JJf." "K.dF" "JkD." ""
#   ..- attr(*, "class")= chr "AsIs"

通常,如果要在保持相同结构的同时替换数据,请使用[]替换,如下所示:

mydf[] <- lapply(mydf, function(x) {
  if (is.list(x)) {
    lapply(x, function(y) {
      tolower(gsub("[.,]", "", y))
    })
  } else {
    tolower(gsub("[.,]", "", x))
  }
})

结果如下:

mydf
#   Orig          Matched
# 1 abcd abd, acbd, aad, 
# 2 jkdf  jjf, kdf, jkd, 

str(mydf)
# 'data.frame': 2 obs. of  2 variables:
#  $ Orig   : chr  "abcd" "jkdf"
#  $ Matched:List of 2
#   ..$ : chr  "abd" "acbd" "aad" ""
#   ..$ : chr  "jjf" "kdf" "jkd" ""