Переупорядочить данные CSV-файла в R - PullRequest
4 голосов
/ 11 апреля 2019

У меня есть следующий набор данных, который читается из файла CSV:

1   6.5
2   12
3   9
4   16.2
5   7.5
1   13
2   6
3   2.8
4   26
5   30

Я хотел бы переместить данные второй группы (начиная с 13 до 30) так:

1   6.5   13
2   12    6
3   9     2.8
4   16.2  26
5   7.5   30

Обратите внимание, что эти данные будут записаны в файл CSV.

Как я могу это сделать?Я не знал, как это сделать в R

Ответы [ 3 ]

1 голос
/ 11 апреля 2019

Какой-то "взлом".Вы можете повторно name, а также удалить row.names.

df2<-df[duplicated(df$V1),]
df1<-df[!duplicated(df$V1),]
res<-cbind(df2,df1)
res[,c(2,ncol(res))]

Результат:

     V2 V2.1
6  13.0  6.5
7   6.0 12.0
8   2.8  9.0
9  26.0 16.2
10 30.0  7.5

Данные:

df<-read.table(text="1   6.5
2   12
               3   9
               4   16.2
               5   7.5
               1   13
               2   6
               3   2.8
               4   26
               5   30",header=F)
1 голос
/ 11 апреля 2019

После чтения набора данных (read.csv из base R или fread из data.table или read_csv из rowr) создайте столбец имен столбцов после группировки по 'col1', а затем spread «col2» с «colN»

library(tidvyerse)
df1 %>%
   group_by(col1) %>%
   mutate(colN = str_c("newcol_", row_number())) %>% 
   spread(colN, col2)
# A tibble: 5 x 3
# Groups:   col1 [5]
#   col1 newcol_1 newcol_2
#  <int>    <dbl>    <dbl>
#1     1      6.5     13  
#2     2     12        6  
#3     3      9        2.8
#4     4     16.2     26  
#5     5      7.5     30  

Данные

df1 <-structure(list(col1 = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L
  ), col2 = c(6.5, 12, 9, 16.2, 7.5, 13, 6, 2.8, 26, 30)),
  class = "data.frame", row.names = c(NA, 
 -10L))
0 голосов
/ 11 апреля 2019

Вы можете достичь этого в одной строке, используя data.table и splitstackshape package-

> library(splitstackshape)
> library(data.table)
> cSplit(setDT(dt)[, list(text=paste(V2, collapse=',')), by = V1],"text")

   V1 text_1 text_2
1:  1    6.5   13.0
2:  2   12.0    6.0
3:  3    9.0    2.8
4:  4   16.2   26.0
5:  5    7.5   30.0

ИЛИ

Еще одно сложное решение -

> dcast(dt, V1~V2 ,value.var="V2")
> data.table::as.data.table(t(apply( df, 1, function(x) c(x[!is.na(x)], x[is.na(x)]))))[,.(V1,`1_6.5`,`1_13`)]

       V1 1_6.5 1_13
    1:  1   6.5   13
    2:  2   6.0   12
    3:  3   2.8    9
    4:  4  16.2   26
    5:  5   7.5   30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...