Как составить цикл по обработке колонок?
-
- Активный участник
- Сообщения: 228
- Зарегистрирован: 28 июл 2018, 08:40
- Репутация: 16
- Откуда: Киев
Как составить цикл по обработке колонок?
Имеются огромные таблицы с несколькими сотнями колонок. Каждая колонка отдельное наблюдение
В каждой из них надобно убрать NA и 0. Затем случайно выбрать 150 строк, рассчитать базовую статистику с использованием library(psych) и сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.
В каждой из них надобно убрать NA и 0. Затем случайно выбрать 150 строк, рассчитать базовую статистику с использованием library(psych) и сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Как составить цикл по обработке колонок?
Если все воспринимать буквально, то написано что то странное. Чтобы не гадать, нужен небольшой модельный пример, исходная матрица, и как она меряется (последовательность матриц). Смысл не нужен, произвольные числа. В остальном это 3 строки кода.
-
- Активный участник
- Сообщения: 228
- Зарегистрирован: 28 июл 2018, 08:40
- Репутация: 16
- Откуда: Киев
Re: Как составить цикл по обработке колонок?
Тестовую табличку прикрепил. Остальные таблицы будут аналогичны. Меняться будет только тип вег. индекса.
- Вложения
-
test.csv
- (166 байт) 88 скачиваний
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Как составить цикл по обработке колонок?
в матрице ничего "убрать" нельзя, можно только заменить значения
это о чем? выбрать 150 значений в столбце, и убрать из них 0 и NA или что? 150 значений, отличных от 0 и NA, или как?Затем случайно выбрать 150 строк, рассчитать базовую статистику с использованием library(psych)
автоматизировать тривиально, если напишите наконец, чего нужно сделатьи сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.

примерно так
Код: Выделить всё
my.stat=function(x) { c(min(x),mean(x),max(x)) }
fn="d:/temp/test/test.csv"
p=read.table(fn,header=TRUE,sep=";",as.is=TRUE)
p.mtr=as.matrix(p)
p.names=names(p)
p.mask=(p.mtr == 0)
p.mask[is.na(p.mask)]=TRUE
p.mask = !p.mask
for(i in 1:ncol(p.mtr)) {
cur.name = p.names[i]
cur.mask = p.mask[,i]
max.n = sum(cur.mask)
cur.dat = p.mtr[cur.mask,i]
cur.ind = sort(sample(1:max.n,min(max.n,150),replace=FALSE))
cur.stat = my.stat(cur.dat[cur.ind])
fn=sprintf("d:/temp/test/test-%s.csv",cur.name)
write.table(cur.stat,fn,row.names=FALSE,col.names=FALSE,sep=";")
}
-
- Активный участник
- Сообщения: 228
- Зарегистрирован: 28 июл 2018, 08:40
- Репутация: 16
- Откуда: Киев
Re: Как составить цикл по обработке колонок?
gamm писал(а): ↑26 авг 2024, 06:33Исходный материал - таблица, набор "самостоятельных" данных полученных помесячно с одной территории. Тучи и водные объекты отмечены как NA и 0.автоматизировать тривиально, если напишите наконец, чего нужно сделать![]()
Да надо выбрать 150 значений в каждом столбце, отличных от 0 и NA и рассчитать для каждого столбца базовую статистику с использованием library(psych).это о чем? выбрать 150 значений в столбце, и убрать из них 0 и NA или что? 150 значений, отличных от 0 и NA, или как?
Пока у меня получился такой код. Пока не получается убрать 0Код: Выделить всё
for (i in 1: ncol(wetl)) { a=na.omit(wetl[i]) #b=subset(a[i] != 0) c[i]=sample_n((a), 150) d=describe (c[i]) print(d) }
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Как составить цикл по обработке колонок?
Вы не то делаете, na.omit убирает строки целиком, у вас половина данных пропадет. Решение написано выше.
-
- Активный участник
- Сообщения: 228
- Зарегистрирован: 28 июл 2018, 08:40
- Репутация: 16
- Откуда: Киев
-
- Гуру
- Сообщения: 4168
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1107
- Ваше звание: программист
- Откуда: Казань
Re: Как составить цикл по обработке колонок?
как просили, так и сделал
я же просил писать яснееи сохранить в текстовый файл, имя которого это название колонки

Код: Выделить всё
library(psych)
fn="d:/temp/test/test.csv"
p=read.table(fn,header=TRUE,sep=";",as.is=TRUE)
p.mtr=as.matrix(p)
p.names=names(p)
p.mask=(p.mtr == 0)
p.mask[is.na(p.mask)]=TRUE
p.mask = !p.mask
first = TRUE
for(i in 1:ncol(p.mtr)) {
cur.name = p.names[i]
cur.mask = p.mask[,i]
max.n = sum(cur.mask)
cur.dat = p.mtr[cur.mask,i]
cur.ind = sort(sample(1:max.n,min(max.n,150),replace=FALSE))
cur.stat = as.data.frame(describe(cur.dat[cur.ind]))
cur.stat$ColName = cur.name
if(first) {
out.df = cur.stat
first = FALSE
} else {
out.df = rbind(out.df,cur.stat)
}
}
num = ncol(out.df)
out.df = out.df[,c(num,1:(num-1))]
fn=sprintf("d:/temp/test/test-stat.csv",cur.name)
write.table(out.df,fn,row.names=FALSE,sep=";")
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость