R: Создание нескольких фреймов данных на основе фильтра строк - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть кадр данных (df), который выглядит следующим образом:

  Date           Group       Value
01-04-2029      Saffron      62.78
01-04-2029      Green        75.65
01-05-2019      Saffron      67.89
01-06-2019      Saffron      54.56
01-06-2019      Green        77.00
01-07-2019      Green        71.22

Цель: я хочу создать два отдельных кадра данных на основе Group. По сути, я ищу следующее:

df_saffron: 
    Date           Group       Value
01-04-2029        Saffron      62.78
01-05-2019        Saffron      67.89
01-06-2019        Saffron      54.56

df_green:
   Date           Group        Value
01-04-2029        Green        75.65
01-06-2019        Green        77.00
01-07-2019        Green        71.22

В частности, если я использую следующий фрагмент кода ( этот поток )

for(i in unique(as.character(df$Group))) {
    nam <- paste("df", i, sep = ".")
    assign(nam, df[df$Group==i,])
    }

Я не получаю никаких данных как df.Green или df.Saffron. Я имею в виду, что я получаю

<0 rows> (or 0 -length row.names) 

Я также взглянул на этот ТАК, но я получаю ошибки.

Error in assign(as.character(v, data %>% filter(data$Group == v), envir = .GlobalEnv)) :
argument "value" is missing, with no default
In addition: Warning message:
In data.matrix(data) : NAs introduced by coercion

Я новичок в R и, следовательно, спрашиваю какую-либо подсказку, где я пропускаю?

Ответы [ 3 ]

3 голосов
/ 30 апреля 2020

Используйте split:

list_data <- split(df, df$Group)

Это даст вам список данных, если вам нужны отдельные данные.

names(list_data) <- paste0("df_", names(list_data))
list2env(list_data, .GlobalEnv)

Чтобы показать, как можно преобразовать код for l oop в lapply.

Это for l oop код:

for(i in unique(as.character(df$Group))) {
   nam <- paste("df", i, sep = ".")
   assign(nam, df[df$Group==i,])
   #More code
   #More code
   #More code
}

Чтобы изменить его на lapply:

lapply(split(df, df$Group), function(x) {
   #More code
   #More code
   #More code
})

Вы также можете указать by который не требует разделения данных.

by(df, df$Group, function(x) {
    #More code
    #More code
    #More code
})

Вместо доступа к данным в df_green, df_saffron в for l oop вы можете получить доступ к ним в x в lapply / by.

0 голосов
/ 07 мая 2020

По предложению RonakShah, я попробовал следующее:

temp < -NULL
for (i in unique(as.character(Group)){
    nam <- paste("df", i, sep = ".")
    assign(nam, df[df$Group==i,])
   # more code
   result <- data.frame(Date = dates_all,
                        Group = i,
                        Value = all_values,
                        Derived = der_vals) 
   }
 temp <-result
 final <-rbind(temp,result)

Но финал dataframe выглядит как

      Date           Group       Value     Derived
    01-04-2029      Saffron      62.78      22
    01-04-2029      Saffron      75.65      34.46
    01-05-2019      Saffron      67.89      54
    01-06-2019      Saffron      54.56      78
    01-06-2019      Saffron      77.00      29.85
    01-07-2019      Saffron      71.22      45.67

Другими словами, только Saffron как группа повторяется, хотя полученные значения являются правильными. Может ли какое-нибудь тело помочь в этом?

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

Это должно сделать это:

for (v in unique(df$Group)){

  tmp <- subset(df, Group == v)
  assign(paste0('df_', tolower(v)), tmp)

}

Мне всегда проще сначала создать временный набор данных, а не squa sh, все это в шаге 1 назначения

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