3

私はRを始めたばかりで、かなりうまくやっていますが、これは私を殺しました! :)

私はデータフレームを持っています:

df <- data.frame(
col1=letters[1:5],col2=c(NA,letters[4:1]),col3=letters[11:15],
col1_rr=letters[15:11], col2_rr=letters[2], col3_rr=c(letters[11:14], "oz"))

次のようになります。

     col1      col2    col3    col1_rr  col2_rr  col3_rr
 1     a        NA       k        o        b        k
 2     b        d        l        n        b        l
 3     c        c        m        m        b        m
 4     d        b        n        l        b        n
 5     e        a        o        k        b        oz

列名のパターンに注意してください。各列colXには、 に相当するものがありcolX_rrます。

df[1,"col1"]ここで、 の内容が に含まれているかどうかを確認したいと思いdf[1,"col1_rr"]ます。

たとえば、このステートメントは については false ですdf[1,"col1"]が、すべてのcol3セルについては true です (は に含まれているdf[5,"col3"]ため)。ooz

私はgreplそのために使用できることを知っています:

 > grepl(df[1,"col3"], df[1,"col3_rr"])
 [1] TRUE
 > grepl(df[2,"col1"], df[2,"col1_rr"])
 [1] FALSE
 > grepl(df[1,"col2"], df[1,"col2_rr"])
 [1] NA
 > grepl(df[5,"col3"], df[5,"col3_rr"])
 [1] TRUE

そして次:一般的に言えば、yからの文字[z , colX]が同等のセルに含まれている場合、新しい列を作成し、指定された行に入力し[z , colX_rr]たいと思います。文字fromが同等の文字に含まれていない場合は、 inに入力します。y1y[z , colX][z , colX_rr]0df$y

したがって、最終的には次のようになります。

     col1      col2    col3    col1_rr  col2_rr  col3_rr     a        b (...)  k(...)
 1     a        NA       k        o        b        k        0        0        1
 2     b        d        l        n        b        l        0        0        0
 3     c        c        m        m        b        m        0        0        0
 4     d        b        n        l        b        n        0        1        0
 5     e        a        o        k        b        oz       0        0        0

列範囲の各セルにはcol1:col31 つの文字のみがあり、各参加者 (行) に対して 1 回だけ出現します。列 range col1_rr:の内容col3_rrはかなり乱雑で、長さの異なる文字列が含まれていますが、各文字も各行に 1 回しか存在しません。

NAs も表にあることに注意してください。

実際のデータには 50 列あるため、これを自動化したいのです。ただし、必要に応じて、列ごとに個別のスクリプト行を記述できます。

実際のデータの文字は range からのものletters[1:14]であるため、最後に 14 個の新しい列しかなく、それぞれに値 0 または 1 (またはTRUE/ FALSE、これによりソリューションが簡単になる場合) が含まれます。

私は試してみましたがifelsemergeこのような複雑なルールのために、この問題に対してそれらを機能させる方法がわかりません。

ありがとう!

4

1 に答える 1

1

これが解決策ですが、あまりエレガントではありません。それはreshape2パッケージを使用します:

df <- data.frame(col1=letters[1:5],col2=c(NA,letters[4:1]),col3=letters[11:15],
                 col1_rr=letters[15:11], col2_rr=letters[2], col3_rr=c(letters[11:14], "oz"))
col.vars <- names(df)[1:3]
colrr.vars <- names(df)[4:6]
df$id <- 1:nrow(df)
df.var <- melt(df[,c("id",col.vars)], id.vars="id")
df.var_rr<- melt(df[,c("id",colrr.vars)], id.vars="id")
let <- names(table(unlist(df[,1:3])))
m <- data.frame(sapply(let, function(l) df.var$value==l & grepl(l, df.var_rr$value)))
cbind(df, aggregate(m, list(df.var$id), sum))

これは:

  col1 col2 col3 col1_rr col2_rr col3_rr id Group.1 a  b c d e k l m n o
1    a <NA>    k       o       b       k  1       1 0 NA 0 0 0 1 0 0 0 0
2    b    d    l       n       b       l  2       2 0  0 0 0 0 0 1 0 0 0
3    c    c    m       m       b       m  3       3 0  0 0 0 0 0 0 1 0 0
4    d    b    n       l       b       n  4       4 0  1 0 0 0 0 0 0 1 0
5    e    a    o       k       b      oz  5       5 0  0 0 0 0 0 0 0 0 1
于 2013-03-22T14:00:48.697 に答える