Есть ли функция R, которую можно использовать в цикле for для форматирования данных в текстовый файл? - PullRequest
0 голосов
/ 03 июня 2019

У меня есть набор данных с несколькими записями для каждого субъекта, я хочу создать одну строку для каждого субъекта с переменными значениями в скобках.Я попытался использовать функцию group-by, но в итоге получил строку для каждого субъекта с одинаковыми значениями переменных (для всех субъектов использовались только значения субъекта 1).Код:

mh <- data %>%
 group_by(data$Subject) %>%
 summarise(path = paste(data$y, sep = ",",  collapse = ","),
           days = paste(data$z, sep = ",",  collapse = ","))

Теперь я использую цикл for, чтобы организовать данные в этот формат: Subject 1 [abc] [2 5 7];один предмет на строку

Текущий формат:

Subject  y   z
1        a   2
1        b   5
1        c   7
2        c   5
2        a   10
2        b   12
3        b   4
3        a   9
3        c   14

код цикла:

for(i in 1:3){
  print(cat("Subject",i,"["))
  {  append(data$Subject[i], data$y) 
    print(cat("] ["))
  }
  {   append(data$Subject[i], data$z)  
    print(cat("]\n")) 
  }
}

Я предполагаю, что что-то пропустил в коде, но мог тамбыть проблема с моей настройкой данных, а может быть, тип данных?Есть ли другая функция, которую мне не удалось найти?

1 Ответ

0 голосов
/ 03 июня 2019

Ваша группировка и подведение итогов были правильными. Вот несколько советов:

  • освоиться с paste и paste0, особенно с разницей между опцией sep (для разделения нескольких аргументов, например, paste('a', 'b', sep = ",")) и опцией collapse (для разделения элементов одного аргумента, например, paste(c(1,2,3), collapse = ",")).
  • посмотрите на стандартные форматы данных; Я не знаю, какую систему вы используете, которая ожидает форматы типа [2 4 5], но я бы просто использовал JSON, как с пакетом jsonlite.
  • изучить применение функций, особенно с Map; тогда вы могли бы написать хорошую функцию «предметного принтера» и отобразить ее на свой фрейм данных; было бы намного легче читать и поддерживать.

Вот как я это сделал (я держал вещи близко к вашему исходному коду):

library(dplyr)

data <- data.frame(
  Subject = c(1,1,1,2,2,2,3,3,3),
  y = c('a', 'b', 'c', 'c', 'a', 'b', 'b', 'a', 'c'),
  z = c(2,5,7,5,10,12,4,9,14)
)

mh <- data %>%
  group_by(Subject) %>%
  summarise(
    path = paste0("[", paste(y, collapse = " "), "]"),
    days = paste0("[", paste(z, collapse = " "), "]")
  )

for (i in 1:nrow(mh)) {
  print(paste(
    "Subject",
    mh$Subject[i],
    mh$path[i],
    mh$days[i]
  ))
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...