Извлечь значение из ячейки, где значение одного столбца / строки равно имени столбца - PullRequest
0 голосов
/ 04 февраля 2019

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

Я пробовал разные решения, используя match, cbind, sapply ... и т. Д., Но получаю ошибки о недопустимом типе (матрице) или повторяющихся именах строк.

 df1
 #row   description    sample    ball   square    circle
 1      ball           1a        .78      .04      .22
 2      ball           7b3       .32      .33      .33
 3      square         aaabc     .02      .90      .05
 4      circle         ggg3      .05      .04      .90
 5      circle         44        .01      .25      .70

Мой вывод будетбыть:

 df2
 #row   description    sample    value
 1      ball           1a        .78      
 2      ball           7b3       .32      
 3      square         aaabc     .90      
 4      circle         ggg3      .90
 5      circle         44        .70

И затем, сделав еще один шаг, я бы отфильтровал его

 df2 %>%
 filter(value < .9) %>%
 select(description, sample, value)

В результате:

 #row   description    sample    value
 1      ball           1a        .78      
 2      ball           7b3       .32      
 3      circle         44        .70

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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Кажется, у вас есть процент вероятности.Итак, вы в основном пытаетесь извлечь столбец с наибольшей вероятностью появления, что-то вроде извлечения максимального значения для строки из этих 3 строк.Итак:

Сначала мы создаем функцию для извлечения максимума на строку среди 3 столбцов

    funcionMax <- function(unDf) {
  numFilas <- nrow(unDf)
  vectorMax <- vector()

  for(i in 1:numFilas)
  {
    vectorMax[i]<- max(unDf[i,1],unDf[i,2],unDf[i,3])

  }
  vectorMax
}

Затем мы поднабора, чтобы иметь дело только с этими 3 столбцами, и применяем новую функцию:

vectorFuncionMax <- df %>% select(ball,square,circle) %>% funcionMax
cbind(df,vectorFuncionMax)

И все.Добро пожаловать.

0 голосов
/ 04 февраля 2019

Мы можем использовать индексирование строки / столбца для извлечения значений, которые match имена столбцов со значениями столбца 'description'

m1 <- cbind(seq_len(nrow(df1)), match(df1$description, names(df1)[3:5]))
data.frame(df1[1:3], value = df1[3:5][m1])
#  description sample ball value
#1        ball     1a 0.78  0.78
#2        ball    7b3 0.32  0.32
#3      square  aaabc 0.02  0.90
#4      circle   ggg3 0.05  0.90
#5      circle     44 0.01  0.70

или с tidyverse

library(tidyverse)
df1 %>% 
   rowwise %>% 
   transmute(description, sample, value = get(description))
# A tibble: 5 x 3
#  description sample value
#  <chr>       <chr>  <dbl>
#1 ball        1a      0.78
#2 ball        7b3     0.32
#3 square      aaabc   0.9 
#4 circle      ggg3    0.9 
#5 circle      44      0.7 

данные

df1 <- structure(list(description = c("ball", "ball", "square", "circle", 
 "circle"), sample = c("1a", "7b3", "aaabc", "ggg3", "44"), ball = c(0.78, 
 0.32, 0.02, 0.05, 0.01), square = c(0.04, 0.33, 0.9, 0.04, 0.25
 ), circle = c(0.22, 0.33, 0.05, 0.9, 0.7)), class = "data.frame", 
  row.names = c("1", 
  "2", "3", "4", "5"))
...