Мне нужно проверить сводную статистику (среднее значение, стандартное отклонение и т. Д.) Для многих графиков стеблей и листьев, поэтому я написал несколько функций, чтобы попытаться преобразовать график стеблей и листьев в вектор, так как статистику по векторам легко получить.в R.
График ствола и листа может быть введен в виде матрицы или фрейма данных, где каждая строка является строкой."|"Символ представляет разделитель для десятичного разряда.Например, график ствола и листа ниже
100 | 9
102 | 601
104 | 0678
106 | 5
108 | 649
110 | 3857
112 | 56
114 | 29
может быть введен как
> example.stem = rbind("100|9", "102|601", "104|0678", "106|5", "108|649", "110|3857", "112|56", "114|29")
Две мои функции, которые выполняют преобразование этого графика ствола и листа:
## Convert a single row into a vector
> convert.row = function(current){
temp.split = as.vector(strsplit(current, split="|", fixed=TRUE)[[1]])
int = temp.split[1]
dec = temp.split[2]
dec = (strsplit(dec, ""))[[1]]
temp.string = NULL
for(i in 1:length(dec)){
temp.string[i] = paste(int, dec[i], sep=".")
}
result = as.numeric(temp.string)
return(result)
}
## Convert matrix or dataframe with a stem and leaf plot into a vector
> stem.to.vec = function(df){
df = data.frame(df, stringsAsFactors = F)
result.vec = NULL
for(i in 1:nrow(df)){
current = df[i, ]
result.vec = c(result.vec, convert.row(current))
}
return(result.vec)
}
Мы можем убедиться, что это работает, потому что мы знаем решение:
> solution = c(100.9, 102.6,102.0,102.1,104.0,104.6,104.7,104.8,106.5,108.6,108.4,108.9,110.3,110.8,110.5,110.7,112.5,112.6, 114.2, 114.9)
> stem.to.vec(example.stem) == solution
Хотя это решение работает, оно не элегантно и не эффективно.Мы преобразуем фрейм матрицы / данных со строками в числовое значение, затем обратно в строку и затем снова в числовое значение.Поэтому работа с очень большими участками стеблей и листьев может быть медленной.
Кто-нибудь может предложить лучшее и более эффективное решение с меньшим количеством конверсий?