Настраиваемый фрейм данных с использованием переменных из нескольких фреймов данных и объединением отфильтрованных результатов - доступен репрезент - PullRequest
0 голосов
/ 10 июля 2020

Цели: Создать настраиваемый фрейм данных, который использует переменные двух отдельных фреймов данных. Более конкретно, чтобы использовать переменную имя / идентификатор, которая находится в двух отдельных фреймах данных, вытащите специфицированные c переменные, связанные с переменной имя / идентификатор, а затем настройте выходные данные в одну строку кода для оценки и форматирования модели.

Действия: Ниже я успешно, но неэффективно использовал комбинацию dplyr и a для l oop для достижения указанной выше цели. Кроме того, я приложил фотографии шагов и желаемого результата, чтобы помочь понять проблему.

Проблема: Есть ли более простое решение этой ситуации?

Ниже я есть два фрейма данных, которые я хотел бы использовать для пользовательских сравнений. Фрейм данных 1 - это ромбы с прикрепленными названиями состояний. Фрейм данных 2 имеет имена, которые я хотел бы сравнить.

Первый фрейм данных содержит ключевые переменные, которые мне нужно оценить. enter image description here

The second data frame has two columns of names that I want to use for comparison:

enter image description here

I want to use the names from the second data frame, to pull out custom variables from data frame 1, and then get them on the same row for evaluation purposes.

введите описание изображения здесь

library(tidyverse)
#Data frame 1 - Merge diamonds dataset w/ state names dataset
diamonds <- diamonds[1:50,]
diamonds$name <- state.name
#rearrange diamonds order
test_diamonds <- diamonds[, c(11, 1:10)]

#Data frame 2 - Create two lists for comparisons
example_names1 <- c("Alabama", "Alaska", "Arizona", "Arkansas")
example_names2 <- c("California", "Colorado", "Connecticut", "Delaware")
comp_names <- data.frame(Group1 = example_names1, Group2 = example_names2)

#combine 
df = NULL
for(i in 1:4){
test100 <- test_diamonds %>%
  filter(name == example_names1[i]) %>%
  select(name, depth, price)

test200 <- test_diamonds %>%
  filter(name == example_names2[i]) %>%
  select(name, depth, price)

df <- rbind(df, data.frame(test100, test200))
}

Ответы [ 2 ]

1 голос
/ 10 июля 2020

Здесь можно использовать apply:

apply(comp_names, 1, function(x) {
  colnames = c("name", "depth", "price")
  
  cbind(test_diamonds[test_diamonds$name == x[["Group1"]], colnames],
        test_diamonds[test_diamonds$name == x[["Group2"]], colnames])
})%>%
  do.call("rbind",. )%>%
  setNames(., make.unique(names(.)))

      name depth price      name.1 depth.1 price.1
1  Alabama  61.5   326  California    63.3     335
2   Alaska  59.8   326    Colorado    62.8     336
3  Arizona  56.9   327 Connecticut    62.3     336
4 Arkansas  62.4   334    Delaware    61.9     337
1 голос
/ 10 июля 2020

Вы можете попробовать это. Используйте merge(), чтобы избежать петель. Надеюсь, это поможет.

#Merge
df1 <- merge(comp_names,test_diamonds[,c(1,6,8)],by.x='Group1',by.y = 'name',all.x=T)
#Merge again
df2 <- merge(df1,test_diamonds[,c(1,6,8)],by.x='Group2',by.y = 'name',all.x=T,suffixes = c(1,2))
#Arrange
df2 <- df2[,c(2,1,3:dim(df2)[2])]

    Group1      Group2 depth1 price1 depth2 price2
1  Alabama  California   61.5    326   63.3    335
2   Alaska    Colorado   59.8    326   62.8    336
3  Arizona Connecticut   56.9    327   62.3    336
4 Arkansas    Delaware   62.4    334   61.9    337
...