Как объединить строки в кадре данных в R? - PullRequest
0 голосов
/ 25 сентября 2018

У меня очень большой фрейм данных (121920 obs из 7 переменных).Все переменные являются факторами.Фрейм данных выглядит следующим образом (с большим количеством строк и разных уровней для каждой переменной):

metaDATA:

         SITE        SOIL        TIME                      HOST TISSUE TEMP             MEDIA
MSHM1                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM2                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM3                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM4                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM5                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM6                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM7                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM8                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA

Я хочу объединить каждые 4 строки в 1 строку в новом фрейме данных,Примерно так:

MSHM1                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM4                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM8                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA
MSHM12                  Sorkhe Gypsum Soil 2016-Winter          Acantholimon sp.   Leaf   23               PDA

Или оставить только 1 из каждых 4 строк, поскольку они имеют одинаковый уровень каждой переменной.

Я пробовал:

S1<-seq(1,121920,4)
S2<-seq(4,121920,4)
D<-matrix(0,length(S1),7)
for (i in 1:length(S1)) {
  D[i,1]<-noquote(paste(metaDATA[S1[i]:S2[i],1]))
  D[i,2]<-noquote(paste(metaDATA[S1[i]:S2[i],2]))
  D[i,3]<-noquote(paste(metaDATA[S1[i]:S2[i],3]))
  D[i,4]<-noquote(paste(metaDATA[S1[i]:S2[i],4]))
  D[i,5]<-noquote(paste(metaDATA[S1[i]:S2[i],5]))
  D[i,6]<-noquote(paste(metaDATA[S1[i]:S2[i],6]))
  D[i,7]<-noquote(paste(metaDATA[S1[i]:S2[i],7]))
  }

Ноэто не сработало, и я получил эту ошибку:

Error in D[i, 6] <- noquote(paste(metaDATA[S1[i]:S2[i], 6])) : 
  number of items to replace is not a multiple of replacement length

Ответы [ 5 ]

0 голосов
/ 27 сентября 2018

С помощью друга я нашел код, который работал так, как я хотел.Вот код, который я использовал:

S1<-seq(1,121920,4)
S2<-seq(4,121920,4)
D<-matrix(0,length(S1),7)
for (i in 1:length(S1)) {
  D[i,1]<-noquote(paste(data[S2[i],1]))
  D[i,2]<-noquote(paste(data[S2[i],2]))
  D[i,3]<-noquote(paste(data[S2[i],3]))
  D[i,4]<-noquote(paste(data[S2[i],4]))
  D[i,5]<-noquote(paste(data[S2[i],5]))
  D[i,6]<-noquote(paste(data[S2[i],6]))
  D[i,7]<-noquote(paste(data[S2[i],7]))
  }

Это сохранило каждую четвертую строку моего исходного фрейма данных и дало мне новую матрицу.Спасибо.

0 голосов
/ 25 сентября 2018

или вы просто создаете вектор для индексации строк, которые вы хотите извлечь

index_<-seq(1, nrow(df), by = 4)
df[index_,]
0 голосов
/ 25 сентября 2018

Мы можем использовать %% (по модулю) для создания индексов строк для поднабора:

D <- df[(1:nrow(df)%%4) == 1, ]

Вывод:

> (1:nrow(mtcars)%%4)
 [1] 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0 1 2 3 0

> mtcars[(1:nrow(mtcars)%%4)==1,]
                   mpg cyl  disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
Hornet Sportabout 18.7   8 360.0 175 3.15 3.440 17.02  0  0    3    2
Merc 230          22.8   4 140.8  95 3.92 3.150 22.90  1  0    4    2
Merc 450SL        17.3   8 275.8 180 3.07 3.730 17.60  0  0    3    3
Chrysler Imperial 14.7   8 440.0 230 3.23 5.345 17.42  0  0    3    4
Toyota Corona     21.5   4 120.1  97 3.70 2.465 20.01  1  0    3    1
Pontiac Firebird  19.2   8 400.0 175 3.08 3.845 17.05  0  0    3    2
Ford Pantera L    15.8   8 351.0 264 4.22 3.170 14.50  0  1    5    4
0 голосов
/ 25 сентября 2018

В соответствии с вашей проблемой, допустим, вы хотите занять 1 строку после пропуска 3 строк

take = 1
skip = 3

total = nrow(df)
reps = total %/% (skip + take)
index = rep(0:(reps-1), each = take) * (skip + take) + 1

Значение индекса

# Assuming nrow(df) = 100 
[1]  1  5  9 13 17 21 25 29 33 37 41 45 49 53 57 61 65 69 73 77 81 85 89 93 97

Теперь вы можете получить свое подмножество:

subset = df[index, ]
0 голосов
/ 25 сентября 2018

при условии, что ваша дата названа df, попробуйте

newdf <- df[ c(TRUE, rep(FALSE,3) ), ]

сохранить первый ряд, пропустить 3, сохранить пятый ряд, пропустить 3 и т. Д. ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...