0

次のような data.frame (DF) があります。

 Col_names1      Col_values1    Col_names2     Col_values2    
     a                98             f               1           
     b                12             h              0.8         
     d                 0             mn              0            
     e               0.12            p               0                 
    ....             ....           ....            ....

各 Col_names 列の Col_names の頻度を行ごとに表にする必要があります。そうするために、最初に名前だけを抽出して、次の new_DF を作成しました。

 Col_names1       Col_names2     
     a                f                
     b                h                 
     d                mn                  
     e                p                    
    ....             ....           

次に、apply 関数を使用して、名前の頻度を行ごとに表にしました。

apl = apply(new_DF, 1, table)

問題は、初期DFの関連する数値が「0」の場合でも(たとえば「d」など)、名前の頻度が得られることです。この周波数は計算する必要はありません。

PS: 完全に data.frame には 500 列と 80 行があります。

4

2 に答える 2

1

1 つのオプションは a を使用することですlist(ただし、この場合は長いデータ形式の方が便利で、データはそれほど大きくないと思います)。

data.frameあなたが「mydf」と呼ばれると仮定します:

## Create a matrix to subset each pair of columns
mat <- matrix(1:4, ncol = 2, byrow = TRUE)

## use `lapply` to subset and remove the offensive rows
lapply(sequence(nrow(mat)), function(x) {
  temp <- mydf[mat[x, ]]
  temp[temp[2] != 0, ]
})
# [[1]]
#   Col_names1 Col_values1
# 1          a       98.00
# 2          b       12.00
# 4          e        0.12
# 
# [[2]]
#   Col_names2 Col_values2
# 1          f         1.0
# 2          h         0.8

@dayneの回答に基づいて、列に通常のパターンで名前が付けられている場合、reshape非常に効果的に使用して長い形式を取得できます。ただし、「id」変数が必要です(sequence(nrow(DF))必要があります)。

例:

### Sample data
set.seed(1)
DF <- data.frame(col_names1 = sample(letters[1:13], 30, replace=TRUE),
                 col_values1 = sample(0:10, 30, replace=TRUE),
                 col_names2 = sample(letters[14:26], 30, replace=TRUE),
                 col_values2 = sample(0:10, 30, replace=TRUE))

### Add the ID
DF <- cbind(id = 1:nrow(DF), DF)

### Reshape the data into a long form
out <- reshape(DF, direction = "long", idvar="id", 
               varying = setdiff(names(DF), "id"), sep = "")

### Subset
out2 <- out[out$col_values != 0, ]
head(out2)
#     id time col_names col_values
# 1.1  1    1         d          5
# 2.1  2    1         e          6
# 3.1  3    1         h          5
# 4.1  4    1         l          2
# 5.1  5    1         c          9
# 6.1  6    1         l          7
于 2013-09-11T13:13:01.483 に答える