2017-04-11 23 views
0

我有2列數據幀(DF),其中一列包含向量,另一列是字符。在維護結構的同時格式化矢量的df列。 (R)

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

我的目標是去除所有的標點符號(逗號和句點),並使所有內容都爲小寫。這對字符列來說很簡單,但矢量列更具挑戰性。

一些小寫的方法我嘗試使用是

  • lapply(DF, tolower)。這會導致數據幀轉換爲矩陣。在這樣做時,我失去了向量結構的列。

在問候標點,我試圖

  • gsub("\\.", "", DF)
  • gsub("\\,", "", DF)以分別除去的句號和逗號。

這會導致數據幀轉換爲字符列表。

我想我的問題如下:

  • 是否有另一種方法,以消除標點和轉換爲小寫,保留該數據幀結構?

  • 如果不是,我怎麼能夠將上述輸出轉換回原始格式;那是一列向量?

回答

0

我敢肯定還有其他的方法來完成這件事,但這裏有一個非常有效的例子:

DF = data.frame(a = c("JJf.","K.dF","JkD.",""), b = c("ab.d","Acbd","AA.D","")) 
DF2 = as.data.frame(lapply(X = DF, FUN = tolower)) 
DF2$a = gsub(pattern = "\\.",replacement = "", x = DF2$a) 

數據幀列表只是特殊情況下,所有的元素都具有相同長度如此強制回到第四位通常不是問題。

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" ""