web-dev-qa-db-ja.com

さまざまな列にgsubを適用する

gsubをさまざまな列に適用する最も効率的な方法は何ですか?以下は機能しません

x1=c("10%","20%","30%")
x2=c("60%","50%","40%")
x3 = c(1,2,3)
x = data.frame(x1,x2,x3)
per_col = c(1,2)
x = gsub("%","",x[,per_col])

指定した列に「%」記号を最も効率的にドロップするにはどうすればよいですか。データフレーム全体に適用できますか?これは、パーセンテージ列がどこにあるかわからない場合に役立ちます。

12
Richard

applyを使用して、data.frame全体に適用できます。

apply(x, 2, function(y) as.numeric(gsub("%", "", y)))
     x1 x2 x3
[1,] 10 60  1
[2,] 20 50  2
[3,] 30 40  3
9

または、lapplyソリューションを試すこともできます。

as.data.frame(lapply(x, function(y) gsub("%", "", y)))

  x1 x2 x3
1 10 60  1
2 20 50  2
3 30 40  3
7
info_seekeR

最初の答えは機能しますが、文字列とともにdata.frameを使用している場合は注意してください。@ docendodiscimusの答えはNAsを返します。

列の内容を文字列として保持する場合は、as.numericを削除し、次の後にテーブルをデータフレームに変換します。

as.data.frame(apply(x, 2, function(y) as.numeric(gsub("%", "", y))))
     x1 x2 x3
[1,] 10 60  1
[2,] 20 50  2
[3,] 30 40  3
2
Simon C.

%をクリーンアップするには、次の操作を実行できます。

x[per_col] <- lapply(x[per_col], function(y) as.numeric(gsub("%", "", y)))

x
  x1 x2 x3
1 10 60  1
2 20 50  2
3 30 40  3
2
sindri_baldur

unlistper_col列、「% "記号を入力して数値に変換します。

x[per_col] <- as.numeric(gsub("%","", unlist(x[per_col])))
#In this case using sub would be enough too as we have only 1 % symbol to replace
#x[per_col] <- as.numeric(sub("%","", unlist(x[per_col])))

x
#  x1 x2 x3
#1 10 60  1
#2 20 50  2
#3 30 40  3
1
Ronak Shah

追加するには docendo discimus'answer 、隣接していない列を持ち、data.frameを返す拡張機能:

x1 <- c("10%", "20%", "30%")
x2 <- c("60%", "50%", "40%")
x3 <- c(1, 2, 3)
x4 <- c("60%", "50%", "40%")

x <- data.frame(x1, x2, x3, x4)

x[, c(1:2, 4)] <- as.data.frame(apply(x[,c(1:2, 4)], 2,
                                         function(x) {
                                           as.numeric(gsub("%", "", x))}
))

> x
  x1 x2 x3 x4
1 10 60  1 60
2 20 50  2 50
3 30 40  3 40

> class(x)
[1] "data.frame"
1
bathyscapher