Есть ли способ позволить наибольшему значению на X (из X, Y, Z) определять значение на V в R? - PullRequest
0 голосов
/ 28 декабря 2018

У меня есть набор данных (ft.mutate.topics) с пятью переменными (четыре числовых: ft_technical, ft_perforrative, ft_procedural и ft_moral).Пятый - "topic_lab", и я хотел бы, чтобы он взял имя (как символ), относящееся к переменной с наибольшим значением из четырех других.

Ниже приведен набор данных, аналогичный моему.

set.seed(1)
Data <- data.frame(
X = sample(1:10),
Y = sample(1:10),
Z = sample(1:10))

Я хотел бы, чтобы переменная - V - принимала либо "X", "Y", либо "Z" для каждого наблюдения, соответствующего какой из этих трех переменных, которая принимаетсамое высокое значение - в качестве примера для X это снова похоже:

if (Data$X > Data$Y & Data$X > Data$Z) Data$label <- "X"

Warning message:
In if (Data$X > Data$Y & Data$X > Data$Z) Data$label <- "X": 
the condition has length > 1 and only the first element will be used    

В отношении моего первоначального примера я попробовал следующее с комбинацией команд if:

if (ft.mutate.topics$ft_technical > ft.mutate.topics$ft_performative &
    ft.mutate.topics$ft_technical > ft.mutate.topics$ft_procedural &
    ft.mutate.topics$ft_technical > ft.mutate.topics$ft_moral)
  ft.mutate.topics$topic_lab = "technical"

if (ft.mutate.topics$ft_performative > ft.mutate.topics$ft_technical &
    ft.mutate.topics$ft_performative > ft.mutate.topics$ft_procedural &
    ft.mutate.topics$ft_performative > ft.mutate.topics$ft_moral)
  ft.mutate.topics$topic_lab = "performative"

if (ft.mutate.topics$ft_procedural > ft.mutate.topics$ft_performative &
    ft.mutate.topics$ft_procedural > ft.mutate.topics$ft_technical &
    ft.mutate.topics$ft_procedural > ft.mutate.topics$ft_moral)
  ft.mutate.topics$topic_lab = "procedural"

if (ft.mutate.topics$ft_moral > ft.mutate.topics$ft_performative &
    ft.mutate.topics$ft_moral > ft.mutate.topics$ft_procedural &
    ft.mutate.topics$ft_moral > ft.mutate.topics$ft_technical)
  ft.mutate.topics$topic_lab = "moral"

В нем говорится: «условие имеет длину> 1, и будет использоваться только первый элемент» и заменяет всю переменную на «перформативную», поскольку она имеет самое высокое значение в строке 1. Кто-нибудь знает, что происходит?

Спасибо!

Ответы [ 3 ]

0 голосов
/ 28 декабря 2018

Это кажется простым.Я буду использовать составленный набор данных, адаптировать его к вашему должно быть легко.

nms <- sub("^ft_", "", names(ft))
ft$topic.lab <- apply(ft, 1, function(x) nms[which.max(x)])

Данные.

Это моделируемый набор данных.

set.seed(1234)
n <- 20
ft <- data.frame(ft_X = rnorm(n, 0, 2),
                 ft_Y = rnorm(n, 0, 3),
                 ft_Z = rnorm(n, 0, 4))
0 голосов
/ 28 декабря 2018

Вы можете использовать max.col, чтобы получить максимальный индекс столбца.Затем вы задаете для этого names фрейма данных.

Data$V <- names(Data)[max.col(Data)]

По умолчанию это деление связей случайным образом.

0 голосов
/ 28 декабря 2018

Вот возможный подход с использованием apply и which.max:

# create a fake input with random data
set.seed(123)
DF <- data.frame(ft_technical=sample(1:10,10),
                 ft_performative=sample(1:10,10),
                 ft_procedural=sample(1:10,10),
                 ft_moral=sample(1:10,10))

# add the columns using apply and which.max
mx <- DF[,c('ft_technical','ft_performative','ft_procedural','ft_moral')]
DF$topic_lab <- c('technical','performative','procedural','moral')[apply(mx,1,which.max)]

Вывод:

> DF
   ft_technical ft_performative ft_procedural ft_moral    topic_lab
1             3              10             9       10 performative
2             8               5             7        9        moral
3             4               6             6        6 performative
4             7               9            10        8   procedural
5             6               1             4        1    technical
6             1               7             8        3   procedural
7            10               8             3        4    technical
8             9               4             2        7    technical
9             2               3             1        5        moral
10            5               2             5        2    technical
...