26

ETA:ちなみに、以下のポイントは、提案されたソリューションである場合に備えて、列ベクトルのセット全体を反復処理する必要がないことです(一度に1回だけ機能することがわかっていることを実行してください)。


Rのデータフレームの単一のベクトルの値を他の値に置き換える例はたくさんあります。

また、のすべての値をNA他のものに置き換える方法:

私が探しているのは最後の質問に似ていますが、基本的にある値を別の値に置き換えようとしています。複数の列が基準を満たしている場合、または単に複数の列で最初の2つの質問のアクションを実行しようとしている場合に、実際のデータフレームにマップされた論理値のデータフレームを生成するのに問題があります。

例:

data <- data.frame(name = rep(letters[1:3], each = 3), var1 = rep(1:9), var2 = rep(3:5, each = 3))

data
  name var1 var2
1    a    1    3
2    a    2    3
3    a    3    3
4    b    4    4
5    b    5    4
6    b    6    4
7    c    7    5
8    c    8    5
9    c    9    5

4そして、 inとのすべての値をにしたいvar1var2します10

これは初歩的なものだと確信しており、適切に考えていません。私は次のようなことを試みてきました:

data[data[, 2:3] == 4, ]

それは機能しませんが、のdata[, 2]代わりに同じことを行うと、問題なくdata[, 2:3]機能します。論理テスト(のようなis.na())は複数の行/列で機能するようですが、数値比較はそれほどうまく機能していませんか?

提案をありがとう!

4

4 に答える 4

69

データフレーム全体を検索して、置き換えようとしている値と一致する値を探します。同じように、欠落しているすべての値を10に置き換えるなどの論理テストを実行できます。

data[ is.na( data ) ] <- 10

4をすべて10に置き換えることもできます。

data[ data == 4 ] <- 10

少なくとも私はそれがあなたが求めているものだと思いますか?

そして、最初の行を無視したいとしましょう(すべて文字なので)

# identify which columns contain the values you might want to replace
data[ , 2:3 ]

# subset it with extended bracketing..
data[ , 2:3 ][ data[ , 2:3 ] == 4 ]
# ..those were the values you're going to replace

# now overwrite 'em with tens
data[ , 2:3 ][ data[ , 2:3 ] == 4 ] <- 10

# look at the final data
data
于 2013-02-06T20:09:29.490 に答える
5

基本的に:の代わりにdata[, 2:3]==4のインデックスを提供しました:data[,2:3]data

R > data[, 2:3] ==4
       var1  var2
 [1,] FALSE FALSE
 [2,] FALSE FALSE
 [3,] FALSE FALSE
 [4,]  TRUE  TRUE
 [5,] FALSE  TRUE
 [6,] FALSE  TRUE
 [7,] FALSE FALSE
 [8,] FALSE FALSE
 [9,] FALSE FALSE

だからあなたはこれを試すことができます:

R > data[,2:3][data[, 2:3] ==4]
[1] 4 4 4 4
于 2013-02-06T20:12:09.603 に答える
2

別の答えを提供するために、私はベクトル数学のアプローチを書くと思いました:

ベクトル化された「ifelse」ステートメントを使用して、変換行列(実際にはここではデータフレームですが、同じように機能します)を作成し、次のように変換行列と元のデータを乗算できます。

df.Rep <- function(.data_Frame, .search_Columns, .search_Value, .sub_Value){
   .data_Frame[, .search_Columns] <- ifelse(.data_Frame[, .search_Columns]==.search_Value,.sub_Value/.search_Value,1) * .data_Frame[, .search_Columns]
    return(.data_Frame)
}

2列目から3列目のデータフレーム「data」のすべての値4を10に置き換えるには、次のような関数を使用します。

# Either of these will work.  I'm just showing options.
df.Rep(data, 2:3, 4, 10)
df.Rep(data, c("var1","var2"), 4, 10)

#   name var1 var2
# 1    a    1    3
# 2    a    2    3
# 3    a    3    3
# 4    b   10   10
# 5    b    5   10
# 6    b    6   10
# 7    c    7    5
# 8    c    8    5
# 9    c    9    5
于 2013-02-06T20:35:46.203 に答える
1

継続性のためだけに

    data[,2:3][ data[,2:3] == 4 ] <- 10

しかし、見た目は醜いので、2ステップで行う方が良いです。

于 2013-02-06T20:12:44.107 に答える