R - конвертировать столбец в однофакторный уровень - PullRequest
2 голосов
/ 23 апреля 2019

У меня следующая проблема. Я сделал тесты, в этом тесте есть набор образцов ("Sample"), различные категории ("Individual_class"), для которых я записал оценку ("Score_individual_class"), и я также дал итоговая оценка ("Final_Score_Sample") для каждого образца. Это пример:

df<-data.frame(Sample = c(1,1,2,2,3,3),
               Individual_class = c("A","B","A","B","A","B"),
               Score_individual_class = c(10,20,50,80, 30,60),
               Final_Score_Sample = c(80,80,90,90,120,120)

)
  Sample       Individual_class   Score_individual_class  Final_Score_Sample
      1                A                     10                 80
      1                B                     20                 80
      2                A                     50                 90
      2                B                     80                 90
      3                A                     30                120
      3                B                     60                120

Теперь я бы хотел, чтобы Final_Score_Sample находился между Score_individual_class с Individual_class = C. Вот так:

  Sample       Individual_class    Score_individual_class
      1                A                     10
      1                B                     20
      1                C                     80
      2                A                     50
      2                B                     80
      2                C                     90
      3                A                     30
      3                B                     60
      3                C                    120

Я пробовал это:

df_test<-df[,c("Sample", "Final_Score_Sample")]
df_test<- df_test[!duplicated(df_test), ]
df_test$Individual_class<-"C"
df_test$Individual_class<-as.factor(df_test$Individual_class)
names(df_test)[names(df_test)=="Final_Score_Sample"] <- "Score_individual_class"
df_final<-left_join(df, df_test)

Но это не сработало. Может ли кто-нибудь мне помочь?

Ответы [ 4 ]

2 голосов
/ 23 апреля 2019

Здесь реализовано в базе R:

# Your data
df<-data.frame(Sample = c(1,1,2,2,3,3),
               Individual_class = c("A","B","A","B","A","B"),
               Score_individual_class = c(10,20,50,80, 30,60),
               Final_Score_Sample = c(80,80,90,90,120,120))

# Data with correct format
df1 <- df[,1:3]

# Data with incorrect format
df2 <- unique(df[,c(1,4)])
df2$Individual_class <- "C"
colnames(df2)[2] <- "Score_individual_class"

# Gathering data again
df <- rbind(df1, df2)

# Sorting 
df <- df[order(df$Sample, df$Individual_class),]

# Result
  Sample Individual_class Score_individual_class
1      1                A                     10
2      1                B                     20
7      1                C                     80
3      2                A                     50
4      2                B                     80
8      2                C                     90
5      3                A                     30
6      3                B                     60
9      3                C                    120
1 голос
/ 23 апреля 2019

Замените последнюю строку вашего кода на следующую:

df <- rbind(df[c(1:3)],df_test)

И затем сортируйте df:

df <- df[order(df$Sample,df$Individual_class),]
1 голос
/ 23 апреля 2019

Результат

  Sample Individual_class Score_individual_class
1      1                A                     10
2      1                B                     20
3      1                C                     80
4      2                A                     50
5      2                B                     80
6      2                C                     90
7      3                A                     30
8      3                B                     60
9      3                C                    120

код

df %>%
    select(1:3) %>%
    bind_rows(df %>% 
                  select(1, 4) %>%
                  group_by(Sample) %>%
                  summarize(Score_individual_class = first(Final_Score_Sample)) %>%
                  mutate(Individual_class = "C")) %>%
    arrange(Sample)

Данные

library(tidyverse)
df <- data.frame(Sample = c(1,1,2,2,3,3),
                 Individual_class = c("A","B","A","B","A","B"),
                 Score_individual_class = c(10,20,50,80, 30,60),
                 Final_Score_Sample = c(80,80,90,90,120,120),
                 stringsAsFactors = FALSE)
0 голосов
/ 23 апреля 2019

Попробуйте это:

     library(tidyverse)

     df <- bind_rows(df %>% 
            dplyr::select(Sample,Individual_class,Score_individual_class),
           df %>% 
           dplyr::select(Sample,Final_Score_Sample) %>% 
            mutate(Individual_class = "C") %>% 
            rename(Score_individual_class = Final_Score_Sample)) %>% 
           arrange(Sample)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...