У меня есть массив cluster_true
и фрейм данных data
, содержащий в каждой строке 2D-координату.Я хочу сохранить в другом фрейме данных информацию о том, сколько раз для заданной 2D-координаты появлялся каждый элемент в cluster_true
.Так, например, для координаты (1,1) я хочу проверить все строки в data
, первые два столбца которых имеют значение 1
, а затем проверить значения cluster_true
для этих индексов.Вот пример, чтобы прояснить его (он дает желаемый результат):
# Example variables
cluster_true = c(1,2,1,1,2,2,1,2,2,2,2,1,1)
x = 3
y = 3
data = data.frame(X = c(1,1,0,0,2,1,1,0,0,0,1,1,1),
Y = c(1,1,2,1,2,2,1,0,0,0,0,2,0))
# Names of the columns
plot_colnames = c('X', 'Y', paste('cluster',unique(cluster_true),sep='_'))
# Empty dataframe with the right column names
plot_df = data.frame(matrix(vector(), x*y, length(plot_colnames),
dimnames=list(c(), plot_colnames)),
stringsAsFactors=F)
# Each row belongs to a certain 2D coordinate
plot_df$X = rep(1:x, y)-1
plot_df$Y = rep(1:x, each = y)-1
# This is what I don't know how to improve
for(i in 1:nrow(plot_df)){
idx = which(apply(data[,1:2], 1, function(x) all(x == plot_df[i,1:2])))
plot_df[i,3] = sum(cluster_true[idx] == 1)
plot_df[i,4] = sum(cluster_true[idx] == 2)
}
print(plot_df)
Вещи, которые мне нужно изменить, и я не знаю, как:
- Я думаюпетли можно было бы избежать, чтобы получить более элегантное решение, но я не знаю как.Фрейм данных
data
может иметь очень большое количество строк, поэтому эффективный код будет потрясающим. - Внутри цикла я жестко закодировал кластеры для проверки (последние две строки внутри цикла предполагают, что язнать, какие числа присутствуют в
cluster_true
и какому столбцу plot_df
они соответствуют).Фактически, элементы в cluster_true
могут быть чем угодно, даже непоследовательными числами (т. Е. cluster_true = c(1,5,5,5,56,10,19,10)
).
Итак, я хочу знать, можно ли это сделать без цикла икак можно более универсальным.