6

隣接する列の文字列の値に基づいて、さまざまな行にさまざまな関数を適用しようとしています。私のデータフレームは次のようになります。

type    size
A       1
B       3
A       4
C       2
C       5
A       4
B       32
C       3

タイプA、B、Cにさまざまな関数を適用して、3番目の列の列に「size2」を付けたいと思います。たとえば、次の関数がA、B、およびCに適用されるとします。

for A: size2 = 3*size
for B: size2 = size
for C: size2 = 2*size 

このコードを使用して、タイプごとに個別にこれを行うことができます

df$size2 <- ifelse(df$type == "A", 3*df$size, NA)
df$size2 <- ifelse(df$type == "B", 1*df$size, NA)
df$size2 <- ifelse(df$type == "C", 2*df$size, NA)

ただし、他のすべての値を消去せずに、すべてのタイプに対してそれを行うことはできないようです。このコードを使用して、関数の適用をNAである値のみに制限しようとしました(つまり、既存の値を保持し、NA値のみを入力します)が、このコードを使用しても機能しませんでした。

df$size2 <- ifelse(is.na(df$size2), ifelse(df$type == "C", 2*df$size, NA), NA)

誰かアイデアはありますか?「is.na(df $ size2)」と「ifelse(df $ type == "C"」である種のANDステートメントを使用することは可能ですか?

どうもありがとう!

4

3 に答える 3

4

これはもっとRっぽいかもしれません(そして私はデータフレームを「df」ではなく「dat」と呼びました。これdfは一般的に使用される関数だからです。

> facs <- c(3,1,2)
> dat$size2= dat$size* facs[ match( dat$type, c("A","B","C") ) ]
> dat
  type size size2
1    A    1     3
2    B    3     3
3    A    4    12
4    C    2     4
5    C    5    10
6    A    4    12
7    B   32    32
8    C    3     6

このmatch関数は、抽出関数に提供するインデックスを作成するために使用されます[

于 2013-02-03T01:31:27.420 に答える
3

ifelse必要に応じて、 sをネストできます。

df$size2 <- ifelse(df$type == "A", 3*df$size,
                       ifelse(df$type == "B", 1*df$size,
                           ifelse(df$type == "C", 2*df$size, NA)))


#    > df
#  type size size2
#1    A    1     3
#2    B    3     3
#3    A    4    12
#4    C    2     4
#5    C    5    10
#6    A    4    12
#7    B   32    32
#8    C    3     6
于 2013-02-02T23:14:54.607 に答える
0

これにより、次のようになり、タイプごとに個別の論理ベクトルが作成されます。

As <- df$type == 'A'
Bs <- df$type == 'B'
Cs <- df$type == 'C'
df$size2[As] <- 3*df$size[As]
df$size2[Bs] <- df$size[Bs]
df$size2[Cs] <- 2*df$size[Cs]

ただし、より直接的なアプローチは、次のような別のルックアップテーブルを作成することです。

df$size2 <- c(A=3,B=1,C=2)[as.character(df$type)] * df$size
于 2013-02-02T23:37:41.963 に答える