R: замена значений в столбце фрейма данных на более описательное значение - PullRequest
1 голос
/ 27 мая 2020

Я работаю над проектом R, и у меня есть следующий фрейм данных со столбцами «ключ» и «действие»:

действия:

  key           activity
1   1            WALKING
2   2   WALKING_UPSTAIRS
3   3 WALKING_DOWNSTAIRS
4   4            SITTING
5   5           STANDING
6   6             LAYING

У меня также есть другие данные фрейм со столбцами 'subject' и 'activity_label':

new_data:

 subject activity_label 
1       1              2        
2       1              5        
3       1              3         
4       1              5        
5       1              4         
6       1              1         

Для указанного выше фрейма данных я хочу заменить значения в столбце «activity_label» на соответствующее действие описание во фрейме данных "деятельность". Например, метка активности 1 имеет соответствующее описание WALKING, метка активности 2 имеет описание WALKING_UPSTAIRS, et c.

Однако я не уверен, как лучше всего это сделать. Приветствуются любые идеи.

Ответы [ 2 ]

1 голос
/ 27 мая 2020

Поскольку ваши activities уже отсортированы и имеют без пробелов , вы можете использовать номер в activity_label direct как index , чтобы получить активность .

activities$activity[new_data$activity_label]
#[1] "WALKING_UPSTAIRS"   "STANDING"           "WALKING_DOWNSTAIRS"
#[4] "STANDING"           "SITTING"            "WALKING"           

В случае, если действия не отсортированы и имеют пробелы, вы можете создать таблицу поиска и использовать ее для получения действий по номерам:

activity <- "[<-"(NA, activities$key, activities$activity)
activity[new_data$activity_label]
#[1] "WALKING_UPSTAIRS"   "STANDING"           "WALKING_DOWNSTAIRS"
#[4] "STANDING"           "SITTING"            "WALKING"           

Данные:

activities <- read.table(header=TRUE, text="  key           activity
1   1            WALKING
2   2   WALKING_UPSTAIRS
3   3 WALKING_DOWNSTAIRS
4   4            SITTING
5   5           STANDING
6   6             LAYING")

new_data <- read.table(header=TRUE, text=" subject activity_label 
1       1              2        
2       1              5        
3       1              3         
4       1              5        
5       1              4         
6       1              1")
1 голос
/ 27 мая 2020

Вы можете использовать match:

activities$activity[match(new_data$activity_label, activities$key)]

#[1] "WALKING_UPSTAIRS"   "STANDING"           "WALKING_DOWNSTAIRS"
#[4] "STANDING"           "SITTING"            "WALKING"

Или, возможно, merge и удалить ненужный столбец.

merge(new_data, activities, by.x = 'activity_label', by.y = 'key')

Использование dplyr

dplyr::inner_join(new_data, activities, by = c('activity_label' = 'key'))


#  subject activity_label           activity
#1       1              2   WALKING_UPSTAIRS
#2       1              5           STANDING
#3       1              3 WALKING_DOWNSTAIRS
#4       1              5           STANDING
#5       1              4            SITTING
#6       1              1            WALKING
...