2

調査に2つの質問があるとします。1つは、個人が会社を推薦する可能性についてです(簡単にするために2つの会社があるとしましょう)。

したがって、この質問には2つの列を持つ1つのdata.frameがあります。

df.recommend <- data.frame(rep(1:5,20),rep(1:5,20))
colnames(df.recommend) <- c("Company1","Company2")

また、回答者に、会社に「適合する」と信じている属性の横にあるボックスにチェックマークを付けるように求める別の質問があるとします。

したがって、この質問には4列の別のdata.frameがあります。

df.attribute <- data.frame(rep(0:1,50),rep(1:0,50),rep(0:1,50),rep(1:0,50))

colnames(df.attribute) <- c(
"Attribute1.Company1", 
"Attribute2.Company1", 
"Attribute1.Company2", 
"Attribute2.Company2") 

さて、私がやりたいのは、すべての企業(会社に依存しない)について、属性1と2が質問を推奨する可能性のあるスケールにどのように関連しているかを確認することです。たとえば、推奨する可能性が非常に高い人々と属性1の間にどのような慣性があるのか​​を知るためだけに。

それで、私は2つの質問を結びつけることから始めます:

df <- cbind(df.recommend, df.attribute)

私の問題は、列が次のようになるようにこれらのデータをスタックする方法を理解しようとしています。

df.stacked <- data.frame(c(df$Company1,df$Company2),
c(df$Attribute1.Company1,df$Attribute1.Company2), 
c(df$Attribute2.Company1,df$Attribute2.Company2))
colnames(df.stacked) <- c("Likelihood","Attribute1","Attribute2")

この例は大幅に簡略化されています。私の実際の問題では、34の会社と24の属性があります。

すべてのc()ステートメントを入力せずに、それらを効果的にスタックする方法を考えられますか?

注:可能性の列パターンはCo1、Co2、Co3、Co4 ...であり、属性のパターンはAt1.Co1、At2.Co1、At3.Co1 ... At1.Co34、At2.Co34...です。

4

2 に答える 2

4

この種の問題には、Hadley の reshape パッケージが最適なツールです。これをいくつかの stringr および plyr ステートメント (Hadley によって作成されたパッケージも) と組み合わせます。

これは、約12行のコードで完全なソリューションであると私が信じているものです.

まず、いくつかのデータを作成します

library(reshape2) # EDIT 1: reshape2 is faster
library(stringr)
library(plyr)

# Create data frame
# Important: note the addition of a respondent id column

df_comp <- data.frame(
        RespID = 1:10,
        Company1 = rep(1:5, 2),
        Company2 = rep(1:5, 2)
)

df_attr <- data.frame(
        RespID = 1:10,
        Attribute1.Company1 = rep(0:1,5),
        Attribute2.Company1 = rep(1:0,5),
        Attribute1.Company2 = rep(0:1,5),
        Attribute2.Company2 = rep(1:0,5)
)

データ操作を開始します。

# Use melt to convert data from wide to tall

melt_comp <- melt(df_comp, id.vars="RespID")
melt_comp <- rename(melt_comp, c(variable="comp", value="likelihood"))
melt_attr <- melt(df_attr, id.vars="RespID")

# Use str_split to split attribute variables into attribute and company
# "." period needs to be escaped

# EDIT 2:  reshape::colsplit is simpler than str_split
split <- colsplit(melt_attr$variable, "\\.", names=c("attr", "comp")) 
melt_attr <- data.frame(melt_attr, split)
melt_attr$variable <- NULL

# Use cast to convert from tall to somewhat tall

cast_attr <- cast(melt_attr, RespID + comp ~ attr, mean)


# Combine data frames using join() in package plyr

df <- join(melt_comp, cast_attr)
head(df)

そして出力:

  RespID     comp likelihood Attribute1 Attribute2
1      1 Company1          1          0          1
2      2 Company1          2          1          0
3      3 Company1          3          0          1
4      4 Company1          4          1          0
5      5 Company1          5          0          1
6      6 Company1          1          1          0
于 2011-02-16T12:50:59.420 に答える
1

早速作ったもの。見栄えがよくなく、for ループを使用していますが、値が 24 個しかない場合は問題になりません。

df.recommend <- data.frame(rep(1:5,20),rep(1:5,20))
colnames(df.recommend) <- c("Co1","Co2")

df.attribute <- data.frame(rep(0:1,50),rep(1:0,50),rep(0:1,50),rep(1:0,50))

colnames(df.attribute) <- c(
"At1.Co1", 
"At2.Co1", 
"At1.Co2", 
"At2.Co2") 


df.stacked <- data.frame(
    likelihood <- unlist(df.recommend)
    )
str <- strsplit(names(df.attribute),split="\\.")
atts <- unique(sapply(str,function(x)x[1]))

for (i in 1:length(atts)) 
{
    df.stacked[,i+1] <- unlist(df.attribute[sapply(str,function(x)x[1]==atts[i])])
}

names(df.stacked) <- c("likelihood",paste("attribute",1:length(atts),sep=""))

編集:会社は各属性で同じ順序であると想定しています

于 2011-02-16T03:15:58.847 に答える