3

セルに用語のリストが含まれる data.frame があります。

そのリストで見つかった各用語に対して、その特定のセルに用語が存在するかどうかを示す新しい変数を生成したいと考えています。

私は data.frame に複数の異なるインスタンスを持っており、リストの構成について優先順位を知りません。

例 data.frame

require(plyr)

example<-data.frame(groups=letters)

example<-adply(example,
               1,
               function(x) data.frame(value=t(list(sample(LETTERS, 4)))))

    groups      value
1      a F, Y, N, X
2      b N, D, B, Y
3      c W, J, S, U
4      d I, S, N, A
5      e S, Z, Y, A
6      f O, R, J, A

これから、私は取得したい

group     F     N     ...
1     A  TRUE  TRUE  ...
2     B FALSE  TRUE  ...
3     C FALSE FALSE  ...
4

3 に答える 3

3

あなたの要求に従って、ここでは関数形式です

myMatrix <- checkValues(example, makeMatrix=TRUE)
myMatrix

#        A     B     C     D     E     F  ...
#   a FALSE FALSE FALSE FALSE FALSE FALSE ...
#   b FALSE FALSE FALSE FALSE FALSE  TRUE ...
#   c FALSE FALSE FALSE  TRUE FALSE FALSE ...
#   d FALSE  TRUE FALSE  TRUE FALSE FALSE ...
#   e  TRUE FALSE FALSE FALSE FALSE FALSE ...
#   .
#   .
#   .


機能:

checkValues <- function(myDF, makeMatrix=FALSE, makeUnique=TRUE, sort=TRUE)  {
  # myDF should be a data frame containing columns `group` and `value`
  # if `makeMatrix` is T, will convert the list into a long matrix
  # `makeUnique`  and  `sort` only apply if `makeMatrix` is TRUE
  #   (otherwise, they are ignored)

  res<- 
  lapply(myDF$value, function(L1) 
      t(sapply(myDF$value, function(L2) L1 %in% L2 ))
  )

  # Make the names purtty 
  names(res) <- myDF$group

  for (i in 1:length(res))
      dimnames(res[[i]]) <- list(myDF$group, myDF$value[[i]])

  # convert the list to matrix
  if (makeMatrix)  {  
    res <- do.call(cbind, res)

    # remove duplicates, if required
    if (makeUnique) 
      res <- res[, !duplicated(res, MARGIN=2)]

    # order columns, if required
    if (sort)
      res <- res[, order(colnames(res))]
  }

  return(res)
}
于 2012-11-12T20:18:33.120 に答える
2

これがdata.table解決reshape2策です

library(data.table)
EX <- data.table(example)

data.table(dcast(EX[,list(value = unlist(value)),by=groups], groups~value))[,lapply(.SD, is.na),by = groups]

手順の説明

  • EX[,list(value = unlist(value)),by=groups]長い形式で data.table を作成します (リストの値は単一の列になります)

  • dcast(....)columnsA ,...,Z but is an ugly mess ofNA` 値でワイド形式に変換します

  • data.table()[,lapply(.SD), by = groups]グループごとにすべての列を通過し、論理値に変換します。はby必須ではありません (少し遅くなります) が、グループ列を別の方法で処理する必要があり、私は気にしませんでした。


利用可能な要素を事前に知っている場合

列名が事前にわかっている場合、これは使用する簡単な代替手段ですdcast

明らかにLETTERS、可能な値のベクトルに置き換えます。

EX[, setNames(as.list(LETTERS%in% unlist(value)), LETTERS),by = groups]
于 2012-11-12T23:19:24.320 に答える
1

ここでの入力のおかげで、require(plyr) ソリューションも作成しました。

両方のソリューションよりもエレガントではありませんが、何らかの理由で、plyr ソリューションを読む方が簡単だと思います。

単一のダミー変数を生成できる関数を作成する

single.value.to.dummy<-function(value.name, list.of.lists){
  ldply(.data=list.of.lists,
        function(list.element){ dummy<-value.name %in% list.element
                              names(dummy)<-value.name
                              return(dummy)
        })}

この関数をリストのリスト内のすべての一意の値に適用します

list.of.lists.to.dummy<-function(list.of.lists){

#Extract unique values
  value.names<-unique(unlist(list.of.lists))

  dummy.frame<-llply(.data=value.names,
                      function(value.name){
                        dummy<-single.value.to.dummy(value.name, list.of.lists)
                        return(dummy)})

  return(data.frame(dummy.frame))
}

example<-cbind(example, list.of.lists.to.dummy(example$value))


groups      value     T     S     P     O     U     A     C     B     N     V     D     H     Y     F
1      a T, S, P, O  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE
2      b U, A, C, B FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE
3      c S, N, V, D FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE FALSE FALSE FALSE
4      d H, Y, F, X FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE  TRUE  TRUE
5      e M, Y, O, X FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
6      f Y, A, K, S FALSE  TRUE FALSE FALSE FALSE  TRUE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE FALSE
于 2012-11-16T15:10:28.767 に答える