Как читать столбцы CSV организованно в R - PullRequest
0 голосов
/ 10 октября 2018

У меня есть следующий CSV-файл:

Evaluator   5    9    2     8
Parser      10   5    16    2
Tokenizer   19   3    7     10

Я хочу прочитать эти столбцы следующим образом:

Evaluator   5
Parser      10
Tokenizer   19

Evaluator   9
Parser      5
Tokenizer   3

Evaluator   2
Parser      16
Tokenizer   7

Evaluator   8
Parser      2
Tokenizer   10

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

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Мы можем воспользоваться возможностью утилизации R здесь.Вы можете прочитать CSV, как он есть в R, а затем вы можете изменить его на

data.frame(V1 = df$V1 , V2 = unlist(df[-1]))

#       V1  V2
# Evaluator  5
#    Parser 10
# Tokenizer 19
# Evaluator  9
#    Parser  5
# Tokenizer  3
# Evaluator  2
#    Parser 16
# Tokenizer  7
# Evaluator  8
#    Parser  2
# Tokenizer 10

, где V1 - первый столбец кадра данных.


Если нам нужночтобы отсортировать каждую группу в порядке убывания, мы можем создать переменную группировки и arrange.Каждая группа состоит из исходного числа записей в V1, в данном случае это 3, и мы сортируем в порядке убывания в этих группах.

library(dplyr)

data.frame(V1 = df$V1 , V2 = unlist(df[-1])) %>%
  arrange(rep(1:(n()/length(df$V1)), each = length(df$V1)), -V2) 

#          V1 V2
#1  Tokenizer 19
#2     Parser 10
#3  Evaluator  5
#4  Evaluator  9
#5     Parser  5
#6  Tokenizer  3
#7     Parser 16
#8  Tokenizer  7
#9  Evaluator  2
#10 Tokenizer 10
#11 Evaluator  8
#12    Parser  2 

Или гораздо лучший подход с использованием gather

library(dplyr)

df %>%
  gather(Type, Value, -V1) %>%
  arrange(Type, -Value) %>%
  select(-Type)

#          V1 Value
#1  Tokenizer   19
#2     Parser   10
#3  Evaluator   5
#4  Evaluator   9
#5     Parser   5
#6  Tokenizer   3
#7     Parser   16
#8  Tokenizer   7
#9  Evaluator   2
#10 Tokenizer   10
#11 Evaluator   8
#12    Parser   2

data

df <- structure(list(V1 = structure(1:3, .Label = c("Evaluator", "Parser", 
"Tokenizer"), class = "factor"), V2 = c(5L, 10L, 19L), V3 = c(9L, 
5L, 3L), V4 = c(2L, 16L, 7L), V5 = c(8L, 2L, 10L)), .Names = c("V1", 
"V2", "V3", "V4", "V5"), class = "data.frame", row.names = c(NA, 
-3L))
0 голосов
/ 10 октября 2018

Это не умный способ.Но вы можете сделать так:

   df <- structure(list(Data = c("Evaluator", "Parser", "Tokenizer"), 
                 A = c(5L, 10L, 19L), B = c(9L, 5L, 3L), C = c(2L, 16L, 7L
                 ), D = c(8L, 2L, 10L)), row.names = c(NA, -3L), class = c("tbl_df", 
           "tbl", "data.frame"), spec = structure(list(cols = list(Data = 
   structure(list(), class = c("collector_character",                                                                                                                                                                                                                                                                                                                                           
  "collector"))), class = "col_spec"))

library(reshape2)
melt(df)->df
df[-2]
0 голосов
/ 10 октября 2018

Мы можем попробовать прочитать в CSV-файле и затем использовать rbind:

df1 <- data.frame(type=c("Evaluator", "Parser", "Tokenizer"),
                  v1=c(5, 10, 19),
                  v2=c(9, 5, 3),
                  v3=c(2, 16, 7),
                  v4=c(8, 2, 10), stringsAsFactors=FALSE)

df2 <- data.frame(type=character(), value=numeric(), stringsAsFactors=FALSE)
names <- c("type", "value")
df2 <- rbind(df2, setNames(df1[, c(1,2)], names))
df2 <- rbind(df2, setNames(df1[, c(1,3)], names))
df2 <- rbind(df2, setNames(df1[, c(1,4)], names))
df2 <- rbind(df2, setNames(df1[, c(1,5)], names))

df2

enter image description here

Демо

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