Как составить цикл по обработке колонок?

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
_taras_
Активный участник
Сообщения: 228
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Как составить цикл по обработке колонок?

Сообщение _taras_ » 25 авг 2024, 21:33

Имеются огромные таблицы с несколькими сотнями колонок. Каждая колонка отдельное наблюдение
В каждой из них надобно убрать NA и 0. Затем случайно выбрать 150 строк, рассчитать базовую статистику с использованием library(psych) и сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Как составить цикл по обработке колонок?

Сообщение gamm » 25 авг 2024, 22:32

Если все воспринимать буквально, то написано что то странное. Чтобы не гадать, нужен небольшой модельный пример, исходная матрица, и как она меряется (последовательность матриц). Смысл не нужен, произвольные числа. В остальном это 3 строки кода.

_taras_
Активный участник
Сообщения: 228
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Re: Как составить цикл по обработке колонок?

Сообщение _taras_ » 25 авг 2024, 23:35

gamm писал(а):
25 авг 2024, 22:32
нужен небольшой модельный пример, исходная матрица, и как она меряется (последовательность матриц).
Тестовую табличку прикрепил. Остальные таблицы будут аналогичны. Меняться будет только тип вег. индекса.
Вложения
test.csv
(166 байт) 88 скачиваний

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Как составить цикл по обработке колонок?

Сообщение gamm » 26 авг 2024, 06:33

_taras_ писал(а):
25 авг 2024, 21:33
Имеются огромные таблицы с несколькими сотнями колонок. Каждая колонка отдельное наблюдение
В каждой из них надобно убрать NA и 0.
в матрице ничего "убрать" нельзя, можно только заменить значения
Затем случайно выбрать 150 строк, рассчитать базовую статистику с использованием library(psych)
это о чем? выбрать 150 значений в столбце, и убрать из них 0 и NA или что? 150 значений, отличных от 0 и NA, или как?
и сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.
автоматизировать тривиально, если напишите наконец, чего нужно сделать :mrgreen:
примерно так

Код: Выделить всё

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=";")
}

_taras_
Активный участник
Сообщения: 228
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Re: Как составить цикл по обработке колонок?

Сообщение _taras_ » 26 авг 2024, 10:32

gamm писал(а):
26 авг 2024, 06:33
автоматизировать тривиально, если напишите наконец, чего нужно сделать :mrgreen:
Исходный материал - таблица, набор "самостоятельных" данных полученных помесячно с одной территории. Тучи и водные объекты отмечены как NA и 0.
это о чем? выбрать 150 значений в столбце, и убрать из них 0 и NA или что? 150 значений, отличных от 0 и NA, или как?
Да надо выбрать 150 значений в каждом столбце, отличных от 0 и NA и рассчитать для каждого столбца базовую статистику с использованием library(psych).
Пока у меня получился такой код. Пока не получается убрать 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)
}

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Как составить цикл по обработке колонок?

Сообщение gamm » 26 авг 2024, 12:05

Вы не то делаете, na.omit убирает строки целиком, у вас половина данных пропадет. Решение написано выше.

_taras_
Активный участник
Сообщения: 228
Зарегистрирован: 28 июл 2018, 08:40
Репутация: 16
Откуда: Киев

Re: Как составить цикл по обработке колонок?

Сообщение _taras_ » 26 авг 2024, 13:33

gamm писал(а):
26 авг 2024, 12:05
Вы не то делаете, na.omit убирает строки целиком, у вас половина данных пропадет. Решение написано выше.
Спасибо огромное объяснения!
Код формирует огромную кучу однотипных файлов. Возможно изменить его так, чтобы он писал в один файл?

gamm
Гуру
Сообщения: 4168
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1107
Ваше звание: программист
Откуда: Казань

Re: Как составить цикл по обработке колонок?

Сообщение gamm » 26 авг 2024, 14:16

_taras_ писал(а):
26 авг 2024, 13:33
Код формирует огромную кучу однотипных файлов. Возможно изменить его так, чтобы он писал в один файл?
как просили, так и сделал
и сохранить в текстовый файл, имя которого это название колонки
я же просил писать яснее :-)

Код: Выделить всё

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=";")

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость