2

私はRを初めて使用します。次のようなバイナリマトリックスを変換したいと思います:
例:

"   1874 1875 1876 1877 1878 .... 2009  
F     1     0     0     0     0   ...  0
E     1     1     0     0     0   ...  0
D     1     1     0     0     0   ...  0
C     1     1     0     0     0   ...  0
B     1     1     0     0     0   ...  0
A     1     1     0     0     0   ...  0"

列名は年なので、数十年で集計して次のようなものを取得したいと思います。

"1840-1849 1850-1859 1860-1869 .... 2000-2009
F     1     0     0     0     0   ...  0
E     1     1     0     0     0   ...  0
D     1     1     0     0     0   ...  0
C     1     1     0     0     0   ...  0
B     1     1     0     0     0   ...  0
A     1     1     0     0     0   ...  0"

私はPythonに慣れていて、ループを作らずにこの変換を行う方法がわかりません! ありがとう、イザベル

4

2 に答える 2

2

どのような集計をしたいのか不明ですが、以下のダミーデータを使用

set.seed(42)
df <- data.frame(matrix(sample(0:1, 6*25, replace = TRUE), ncol = 25))
names(df) <- 1874 + 0:24

以下は、各 10 年間のイベントをカウントします。

年数を数値変数として取得する

years <- as.numeric(names(df))

次に、各ディケードの開始を表す指標が必要です

ind <- seq(from = signif(years[1], 3), to = signif(tail(years, 1), 3), by = 10)

ind次に( )のインデックスに適用し、現在の 10 年間の1:(length(ind)-1)列を選択し、を使用して s をdf数えます。1rowSums

tmp <- lapply(seq_along(ind[-1]),
              function(i, inds, data) {
                rowSums(data[, names(data) %in% inds[i]:(inds[i+1]-1)])
              }, inds = ind, data = df)

次にcbind、結果のベクトルをデータ フレームに入れ、列名を修正します。

out <- do.call(cbind.data.frame, tmp)
names(out) <- paste(head(ind, -1), tail(ind, -1) - 1, sep = "-")
out

これは与える:

> out
  1870-1879 1880-1889 1890-1899
1         4         5         6
2         4         6         6
3         2         5         5
4         5         5         7
5         3         3         7
6         5         5         4

1その 10 年間に少なくとも 1 つのイベントが発生したことを示す単純なバイナリ マトリックスが必要な場合は、次を使用できます。

tmp2 <- lapply(seq_along(ind[-1]),
               function(i, inds, data) {
                 as.numeric(rowSums(data[, names(data) %in% inds[i]:(inds[i+1]-1)]) > 0)
               }, inds = ind, data = df)
out2 <- do.call(cbind.data.frame, tmp2)
names(out2) <- paste(head(ind, -1), tail(ind, -1) - 1, sep = "-")
out2

与える:

> out2
  1870-1879 1880-1889 1890-1899
1         1         1         1
2         1         1         1
3         1         1         1
4         1         1         1
5         1         1         1
6         1         1         1

別の集計が必要な場合は、呼び出しで適用される関数を変更して、lapply以外のものを使用しますrowSums

于 2013-03-28T14:19:18.003 に答える
1

これは、モジュラ演算を使用して列を集計する別のオプションです。

# setup, borrowed from @GavinSimpson
set.seed(42)
df <- data.frame(matrix(sample(0:1, 6*25, replace = TRUE), ncol = 25))
names(df) <- 1874 + 0:24

result <- do.call(cbind, 
    by(t(df), as.numeric(names(df)) %/% 10 * 10, colSums))

# add -xxx9 to column names, for each decade
dimnames(result)[[2]] <- paste(colnames(result), as.numeric(colnames(result)) + 9, sep='-')

#    1870-1879 1880-1889 1890-1899
# V1         4         5         6
# V2         4         6         6
# V3         2         5         5
# V4         5         5         7
# V5         3         3         7
# V6         5         5         4

以外のもので集計したい場合は、 への呼び出しを のようなものsumに置き換えます 。ここで、f は集計関数です。colSumsfunction(cols) lapply(cols, f)max

于 2013-03-28T15:50:39.357 に答える