Страница 1 из 1
					
				Как составить цикл по обработке колонок?
				Добавлено: 25 авг 2024, 21:33
				 _taras_
				Имеются огромные таблицы с несколькими сотнями колонок. Каждая колонка отдельное наблюдение
В каждой из них надобно убрать NA и 0. Затем случайно выбрать 150 строк,  рассчитать базовую статистику с использованием library(psych) и сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.
			 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 25 авг 2024, 22:32
				 gamm
				Если все воспринимать буквально, то написано что то странное. Чтобы не гадать, нужен небольшой модельный пример, исходная матрица, и как она меряется (последовательность матриц). Смысл не нужен, произвольные числа. В остальном это 3 строки кода.
			 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 25 авг 2024, 23:35
				 _taras_
				gamm писал(а): ↑25 авг 2024, 22:32
нужен небольшой модельный пример, исходная матрица, и как она меряется (последовательность матриц). 
 
Тестовую табличку прикрепил. Остальные таблицы будут аналогичны. Меняться будет только тип вег. индекса.
 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 26 авг 2024, 06:33
				 gamm
				_taras_ писал(а): ↑25 авг 2024, 21:33
Имеются огромные таблицы с несколькими сотнями колонок. Каждая колонка отдельное наблюдение
В каждой из них надобно убрать NA и 0.
 
в матрице ничего "убрать" нельзя, можно только заменить значения
 Затем случайно выбрать 150 строк,  рассчитать базовую статистику с использованием library(psych)
это о чем? выбрать 150 значений в столбце, и убрать из них 0 и NA или что? 150 значений, отличных от 0 и NA, или как?
 и сохранить в текстовый файл, имя которого это название колонки.
Вручную я могу сделать, но хочется автоматизировать процесс.
автоматизировать тривиально, если напишите наконец, чего нужно сделать  

примерно так
Код: Выделить всё
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=";")
}
 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 26 авг 2024, 10:32
				 _taras_
				gamm писал(а): ↑26 авг 2024, 06:33
автоматизировать тривиально, если напишите наконец, чего нужно сделать  
 
Исходный материал - таблица, набор "самостоятельных" данных полученных помесячно с  одной территории. Тучи и водные объекты отмечены как  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)
}
 
 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 26 авг 2024, 12:05
				 gamm
				Вы не то делаете, na.omit убирает строки целиком, у вас половина данных пропадет. Решение написано выше.
			 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 26 авг 2024, 13:33
				 _taras_
				gamm писал(а): ↑26 авг 2024, 12:05
Вы не то делаете, na.omit убирает строки целиком, у вас половина данных пропадет. Решение написано выше.
 
Спасибо огромное объяснения! 
Код формирует огромную кучу однотипных файлов. Возможно изменить его так, чтобы он писал в один файл?
 
			
					
				Re: Как составить цикл по обработке колонок?
				Добавлено: 26 авг 2024, 14:16
				 gamm
				_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=";")