разбиение большого столбца по данным другого столбца - PullRequest
1 голос
/ 30 января 2020

Я собираюсь разделить данные в файле1 на данные другого файла (файла2) и напечатать их в файле 3, как показано ниже: R:

Файл1 = "R10.csv"

    area
1   2.3
2   1
3   2.5
4   3.2
5   5.1
6   0.2
7   0.6
8   0.1
9   0.56
10  0.98
11  6.8
12  0.45

File2 = "S10.csv"

    Count
1   2
2   1
3   3
4   2
5   4

File3 = "filename.csv"

    1   2   3   4   5
1   2.3 2.5 3.2 0.6 0.56
2   1       5.1 0.1 0.98
3           0.2     6.8
4                   0.45

Я написал этот код, но я не ошибаюсь Это. Кто-нибудь может мне помочь, поскольку я новичок в R.

graphics.off()
rm(list = ls())



file1<-read.csv("C:/Users/sha/tmr/csvr/R10.csv")
file2<-read.csv("C:/Users/sha/tmr/csvr/S10.csv")

n=nrow(file2)
m=max(file2$Count, na.rm = TRUE)
td=0
mymat<-matrix(nrow = m, ncol = n)
for(i in 1:n) {

  td<-file2[i,2]
  dataax<-file1[1:td,2];
  if(i=1){
    mymat[1:td,i]=dataax

  }  else{
    mymat[td[i-1]:(td+td[i-1]),i]=dataax

  }

  print(mymat)
}

write.csv(mymat, "filename.csv")

1 Ответ

0 голосов
/ 30 января 2020

Вот опция в base R, где мы split столбец 'area' 'первого' набора данных с помощью rep лицензированной последовательности на основе 'Count' в list, затем преобразуем list в matrix (или data.frame) после заполнения NA в конце, чтобы сделать длины равными в каждом list элементе

lst1 <- split(df1$area, rep(seq_along(df2$Count), df2$Count))
do.call(cbind, lapply(lst1, `length<-`, max(lengths(lst1))))
#      1   2   3   4    5
#[1,] 2.3 2.5 3.2 0.6 0.56
#[2,] 1.0  NA 5.1 0.1 0.98
#[3,]  NA  NA 0.2  NA 6.80
#[4,]  NA  NA  NA  NA 0.45

Или это можно сделать с помощью tidyverse

library(dplyr)
library(tidyr)
df2 %>%
    mutate(rn = row_number()) %>% 
    uncount(Count) %>%
    bind_cols(df1) %>% 
    group_by(rn) %>% 
    mutate(rn2 = row_number()) %>% 
    ungroup %>% 
    pivot_wider(names_from = rn, values_from = area) %>%
    select(-rn2)
# A tibble: 4 x 5
#    `1`   `2`   `3`   `4`   `5`
#  <dbl> <dbl> <dbl> <dbl> <dbl>
#1   2.3   2.5   3.2   0.6  0.56
#2   1    NA     5.1   0.1  0.98
#3  NA    NA     0.2  NA    6.8 
#4  NA    NA    NA    NA    0.45

данные

df1 <- structure(list(area = c(2.3, 1, 2.5, 3.2, 5.1, 0.2, 0.6, 0.1, 
0.56, 0.98, 6.8, 0.45)), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

df2 <- structure(list(Count = c(2L, 1L, 3L, 2L, 4L)),
     class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))
...