R - Проблемы с передачей функции dplyr mutate

63
7

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

Я использую dplyr и я прочитал таблицу и использовал tbl_df:

ActivityLabels<-tbl_df(read.table("./UCI HAR Dataset/activity_labels.txt",stringsAsFactors = FALSE)) 

Это возвращает эту таблицу:

> ActivityLabels
Source: local data frame [6 x 2]

V1 V2
(int) (chr)
1 1 WALKING
2 2 WALKING_UPSTAIRS
3 3 WALKING_DOWNSTAIRS
4 4 SITTING
5 5 STANDING
6 6 LAYING

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

Я написал следующую функцию:

GetActivityNamesFromActivityNumbers <- function(ActivityNumbers)
{
as.character(ActivityLabels[ActivityNumbers,2])
}

И вручную он работает:

> GetActivityNamesFromActivityNumbers(1)
[1] "WALKING"
> GetActivityNamesFromActivityNumbers(2)
[1] "WALKING_UPSTAIRS"
> GetActivityNamesFromActivityNumbers(c(1,2))
[1] "c(\"WALKING\", \"WALKING_UPSTAIRS\")"
>

но следующий mutate не работает, как я ожидаю:

> sample
Source: local data frame [6 x 1]

ActivityName
(int)
1 5
2 5
3 5
4 5
5 5
6 5
> sample %>% mutate(ActivityName = GetActivityNamesFromActivityNumbers(ActivityName))
Source: local data frame [6 x 1]

ActivityName
(chr)
1 c("STANDING", "STANDING", "STANDING", "STANDING", "STANDING", "STANDING")
2 c("STANDING", "STANDING", "STANDING", "STANDING", "STANDING", "STANDING")
3 c("STANDING", "STANDING", "STANDING", "STANDING", "STANDING", "STANDING")
4 c("STANDING", "STANDING", "STANDING", "STANDING", "STANDING", "STANDING")
5 c("STANDING", "STANDING", "STANDING", "STANDING", "STANDING", "STANDING")
6 c("STANDING", "STANDING", "STANDING", "STANDING", "STANDING", "STANDING")
>

Что я делаю не так? когда я пытаюсь передать такие функции, как log, mutate работу, как я ожидаю, но с моей функцией это не так.

Может кто-нибудь, пожалуйста, помогите мне?

спросил(а) 2021-01-25T18:18:07+03:00 4 месяца, 4 недели назад
1
Решение
89

То, что вы хотите, - это простое слияние

setNames(ActivityLabels, c("ActivityName", "ActivityNameLong"))
merge(sample, ActivityLabels, by = "ActivityName")

Причиной вашего поведения является то, что ActivityLabels - это tbl_df. Это приводит к тому, что mutate возвращает data.frame, а не элемент data.frame. Из методов:

[

Никогда не упрощает (падает), поэтому всегда возвращает data.frame

Таким образом, он возвращает кадр данных для каждой строки вместо одного значения.

ответил(а) 2021-01-25T18:18:07+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема