1

次のような 2 つのデータ フレーム df1、df2 があるとします。

df1

        User        Lab      Score
         A           1        52
         A           2        65
         A           3        87
         A           5        78
         B           2        56
         B           4        98
         C           6        78

次に、ユーザー A を残りのデータ フレームから分離した別のデータ フレームがあります。

df2

        User       Lab      Score
        A          1         52
        A          2         65
        A          3         87
        A          5         78

df2 のすべての行を含むデータ フレームを作成したい場合、およびユーザーがラボを試行していない場合は、スコアを 0 にします。したがって、次のようにします。

df3

        User       Lab      Score
        A          1         52
        A          2         65
        A          3         87
        A          4         0
        A          5         78                
        A          6         0 
4

4 に答える 4

2

で一気にやってみませんdata.tableか?

FinalTable = data.table(User=unique(df1$User))[,list(Lab=1:6),by=User]
setkey(FinalTable, User, Lab)
setkey(df1, User, Lab)
FinalTable = df1[FinalTable]
FinalTable[is.na(Score),Score:=0L]

結果:

    User Lab Score
 1:    A   1    52
 2:    A   2    65
 3:    A   3    87
 4:    A   4     0
 5:    A   5    78
 6:    A   6     0
 7:    B   1     0
 8:    B   2    56
 9:    B   3     0
10:    B   4    98
11:    B   5     0
12:    B   6     0
13:    C   1     0
14:    C   2     0
15:    C   3     0
16:    C   4     0
17:    C   5     0
18:    C   6    78
于 2013-08-28T15:59:56.100 に答える
1

これを行うためのより良い方法があると確信していますが、ここに私が思いつくことができるものがあります:

 ##Get unique lab IDs
 labs = as.data.frame(unique(df$Lab))
 names(labs) <- "Lab"

 df3 = merge(df2, labs, all.y = TRUE)
 df3$User[is.na(df3$User)] <- "A"
 df3[is.na(df3)] <- 0
 df3 <- df3[,c(2,1,3)]


 #> df3
 #  User Lab Score
 #1    A   1    52
 #2    A   2    65
 #3    A   3    87
 #4    A   4     0
 #5    A   5    78
 #6    A   6     0
于 2013-08-28T15:54:48.087 に答える
0
User<-c(rep('A',4),rep('B',2),'C')
Lab<-c(1,2,3,4,5,2,6)
Score<-c(52,65,87,78,56,98,78)
df1<-data.frame(User,Lab,Score)
df2<-df1[df1$User=='A',]
## find different value of df1$Lab and df2$Lab
s1<-unique(df1$Lab)
s2<-unique(df2$Lab)
## compute length
f1<-length(s1)-length(s2)
f2<-dim(df2)[1]
## initiate df3
df3<-df2
## expand df3, setdiff means the difference of two sets 
df3[(f2+1):(f2+f1),]<-data.frame(rep('A',f1),setdiff(s1,s2),rep(0,f1))
于 2013-08-28T16:07:01.417 に答える
0

マトリックスを使用して作業する場合 (および各ユーザー/ラボに固有のレコードがある場合)、tapply を使用できます。

mat1 <- tapply(df1$Score, list(df1$Lab, df1$User), mean)
mat1[is.na(mat1)] <- 0
mat1

#   A   B  C
# 1 52  0  0
# 2 65 56  0
# 3 87  0  0
# 4  0 98  0
# 5 78  0  0
# 6  0  0 78

各列がユーザーを表し、ユーザーごとの統計を簡単に抽出できるようになりました。

apply(mat1, 2, mean)
apply(mat1, 2, sd)
于 2013-08-28T17:42:22.917 に答える