Nano Hash - криптовалюты, майнинг, программирование

Создайте несколько фреймов данных из другого фрейма данных в R

У меня есть фрейм данных с совокупными данными, и я хочу создать несколько фреймов данных из каждой строки основного фрейма данных.

df <- as.data.frame(matrix(0, ncol = 7, nrow = 10))
setnames(df, c("V1", "V2", "V3", "V4", "V5", "V6", "V7"), c("wait", "check", "stay", "con1", "con2", "con3", "con4"))
df$wait <- c(8, 9, 8, 7, 9, 8, 10, 6, 10, 5) 
df$check <- c(7, 7, 7, 7, 8, 7, 9, 6, 10, 5) 
df$stay <- c(6, 10, 6, 6, 8, 7, 6, 6, 8, 4) 
df$con1 <- c(3, 4, 0, 2, 4, 2, 0, 3, 0, 1) 
df$con2 <- c(2, 3, 0, 2, 3, 2, 3, 0, 3, 1) 
df$con3 <- c(1, 3, 0, 2, 1, 3, 0, 1, 2, 0) 
df$con4 <- c(0, 0, 6, 0, 0, 0, 3, 2, 3, 2)
rownames(df) <- c("dep1", "dep2", "dep3", "dep4", "dep5", "dep6", "dep7", "dep8", "dep9", "dep10")
df

          wait check stay con1 con2 con3 con4
    dep1     8     7    6    3    2    1    0
    dep2     9     7   10    4    3    3    0
    dep3     8     7    6    0    0    0    6
    dep4     7     7    6    2    2    2    0
    dep5     9     8    8    4    3    1    0
    dep6     8     7    7    2    2    3    0
    dep7    10     9    6    0    3    0    3
    dep8     6     6    6    3    0    1    2
    dep9    10    10    8    0    3    2    3
    dep10    5     5    4    1    1    0    2

Это первый новый кадр данных, созданный вручную из 1-й строки df. Я могу сделать это вручную один за другим, но я хочу написать цикл или функцию для ускорения процесса — создания нескольких новых фреймов данных, таких как dep1, dep2, dep3... dep10. Любая помощь будет высоко оценена.

dep1 <- as.data.frame(matrix(0, ncol = 4, nrow = 8))
setnames(dep1, c("V1", "V2", "V3", "V4"), c("wait", "check", "stay", "symp"))
setDT(dep1, keep.rownames = "id")[]
dep1$wait <- 1
dep1[c(1:7), "check"] = 1
dep1[c(1:6), "stay"] = 1
dep1[, symp:=as.character(symp)]
dep1[c(1:3), "symp"] = "cond1"
dep1[c(4:5), "symp"] = "cond2"
dep1[c(6), "symp"] = "cond3"
dep1[c(7:8), "symp"] = "clear"
dep1

   id wait check stay  symp
1:  1    1     1    1 cond1
2:  2    1     1    1 cond1
3:  3    1     1    1 cond1
4:  4    1     1    1 cond2
5:  5    1     1    1 cond2
6:  6    1     1    1 cond3
7:  7    1     1    0 clear
8:  8    1     0    0 clear

  • В строке dep1 df мы получили wait = 8, check = 7, stay = 6. Мы создаем новый фрейм данных со столбцом wait из 8 строк со значением 1, столбцом check из 7 строк с 1, столбцом stay из 6 строк с 1; другие получили 0 Столбец symp должен собрать оставшиеся столбцы из df (cond1, cond2, cond3, cond4) и назначить их в диапазон строк. Итак, в строке dep1 df мы получили cond1 = 3, cond2 = 2, cond3 = 1, cond4; столбец symp в новом кадре данных будет иметь назначенное значение cond1 в первых 3 строках, cond2 в следующих 2 строках, cond3 в следующей 1 строке, а остальные строки получили 0. 27.03.2020
  • Для строки 4 сумма cond1:cond4 равна 8, но у вас есть wait как 7. Это опечатка? 27.03.2020
  • @ РонакШах, да! Извините, cond4 должно быть 0, поэтому вместо этого сумма должна совпадать с числом stay. Я внес поправку. 27.03.2020
  • Хорошо... тогда мое решение ниже должно работать. Вы пробовали это? 27.03.2020
  • @RonakShah Большое спасибо! Я проверил вывод, и он соответствует выводу. Выглядит идеально! Также спасибо за функцию удаления из списка - мне было интересно об этом. Еще раз спасибо! 27.03.2020
  • @RonakShah Текущая функция обусловлена ​​созданием строк dep1 на основе значения wait в df - as.data.frame(matrix(0, ncol = 4, nrow = x[1],. У меня есть несколько случаев, когда значение wait в df меньше, чем значение stay в df. Это означает, что вместо этого я должен был создать строки на основе значения stay в df. Есть ли способ, которым мы могли бы создать строки в зависимости от размера wait и stay, поэтому мы используем тот, у которого больше значение. Я исправляю строку dep2 в строке df, чтобы вы могли видеть, что я пытаюсь сказать. 27.03.2020
  • да, вы можете просто изменить эту часть matrix(0,ncol = 4, nrow = x[1] на matrix(0,ncol = 4, nrow = max(x[1], x[3]) Таким образом, измененная строка в функции будет: temp <- as.data.frame(matrix(0,ncol = 4, nrow = max(x[1], x[3]) dimnames = list(NULL, c("wait", "check", "stay", "symp")))) 27.03.2020
  • @RonakShah большое спасибо!!!! 27.03.2020

Ответы:


1

Вот как это сделать в базе R:

apply_fun <- function(x) {
   temp <- as.data.frame(matrix(0,ncol = 4, nrow = x[1], 
             dimnames = list(NULL, c("wait", "check", "stay", "symp"))))
   temp$wait <- 1
   temp$check[seq_len(x[2])] <- 1
   temp$stay[seq_len(x[3])] <- 1
   temp$symp <- rep(c(paste0('cond', 1:4), 'clear'), 
                    c(x[4:7], x[1] - sum(x[4:7])))
   temp
}

а затем применить его для каждой строки

list_out <- apply(df, 1, apply_fun)
list_out

#$dep1
#  wait check stay  symp
#1    1     1    1 cond1
#2    1     1    1 cond1
#3    1     1    1 cond1
#4    1     1    1 cond2
#5    1     1    1 cond2
#6    1     1    1 cond3
#7    1     1    0 clear
#8    1     0    0 clear

#$dep2
#  wait check stay  symp
#1    1     1    1 cond1
#2    1     1    1 cond2
#3    1     1    1 cond2
#4    1     1    1 cond2
#5    1     1    1 cond3
#6    1     1    1 cond3
#7    1     1    1 cond3
#8    1     0    0 clear
#9    1     0    0 clear
#...
#...

Если они вам нужны как отдельные кадры данных, такие как dep1, dep2 и т. д., мы можем использовать list2env.

list2env(list_out, .GlobalEnv)
27.03.2020
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

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

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..