Проверьте, равна ли строка элементу dataframe - PullRequest
0 голосов
/ 06 апреля 2019

У меня, как мне показалось, простая задача: проверить, соответствует ли элемент dataframe определенному значению.

У меня есть данные по зерновым, с такими столбцами, как Марка, Производитель, Калории и т. Д.

Вот пример строки:

> data[1, ]
       Brand Manufacturer Calories Protein Fat Sodium Fiber Carbohydrates Sugar Potassium
1 ACCheerios            G      110       2   2    180   1.5          10.5    10        70

Я думал, что это будет работать:

> 'G' == data[1, ]$Manufacturer
[1] FALSE

или, может быть

> 'G' %in% data[1, ]$Manufacturer
[1] FALSE

но ни один не делает.

Я проверил эти предыдущие вопросы: Проверить, находится ли значение во фрейме данных Проверить, существует ли значение в одном фрейме данных или нет

Кажется, ни один из них не делает то, что я хочу. Единственное решение, которое я нашел, - это сначала использовать unlist() в строке, в результате чего Бренд / Производитель становятся числами

> unlist(data[1, ])
        Brand  Manufacturer      Calories       Protein           Fat        Sodium         Fiber Carbohydrates         Sugar 
          1.0           1.0         110.0           2.0           2.0         180.0           1.5          10.5          10.0 
    Potassium 
         70.0 

, а затем оба вышеуказанных решения работают нормально, пока я использую 1 вместо G.

> 1 == unlist(data[1, ])[2]
Manufacturer 
        TRUE 

> 1 %in% unlist(data[1, ])[2]
[1] TRUE

Я думаю, что это не работает, потому что когда я просто печатаю data[1, ]$Manufacturer, возвращается больше, чем просто столбец. Что-то про "Уровни" тоже возвращается:

> data[1, ]$Manufacturer
[1]  G
Levels:  G  K  Q

Я пытался сделать data[1, ]$Manufacturer[1] (и другие разные вещи, чтобы попробовать и просто вернуть G) безрезультатно.

Как мне сделать это относительно простое задание?

Ответы [ 3 ]

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

Самое важное здесь следующее:

Я думаю, что это не работает, потому что когда я просто распечатываю данные [1,] $ Manufacturer, возвращается больше, чем просто столбец. Что-то про "Уровни" тоже возвращается:

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

Создать фрейм данных

df = data.frame(A = c("Aa", "Bb","Cc", "Dd"),B=c(1,2,3,4), C=c(5,6,7,8))
str(df) 
#> 'data.frame':    4 obs. of  3 variables:
#>  $ A: Factor w/ 4 levels "Aa","Bb","Cc",..: 1 2 3 4
#>  $ B: num  1 2 3 4
#>  $ C: num  5 6 7 8

Следуя примеру ТАК , вы сказали, что пытались:

"Aa" %in% df
#> [1] FALSE
any(df=="Aa") 
#> [1] TRUE
Reduce("|", df=="Aa") 
#> [1] TRUE
length(which(df=="Aa"))>0 
#> [1] TRUE
is.element("Aa",unlist(df[1,])) 
#> [1] FALSE

Переход к исходным попыткам:

## Search when column 1 ("A") is a *factor*
"Aa" %in% df[1,] # Checking the entire row for a CHARACTER elemtn "Aa"
#> [1] FALSE
"Aa" %in% df[1,1] # Checking the first row and first column for character element "Aa"
#> [1] TRUE
"Aa" %in% df$A # Index a speific column
#> [1] TRUE
factor("Aa") %in% df$A # Also works if we specify the search criterion as a factor
#> [1] TRUE

Поиск, когда столбец 1 («A») имеет коэффициент :

# Force df$A to a character 
df$A <- as.character(df$A)
str(df) #now we have a character, numeric, and numeric
#> 'data.frame':    4 obs. of  3 variables:
#>  $ A: chr  "Aa" "Bb" "Cc" "Dd"
#>  $ B: num  1 2 3 4
#>  $ C: num  5 6 7 8

Вы изначально пытались сканировать всю строку:

"Aa" %in% df[1,] 
#> [1] TRUE

Попробуйте другие варианты снова, просто чтобы проверить поведение:

"Aa" %in% df[1,1] # Checking the first row and first column for character element "Aa"
#> [1] TRUE
"Aa" %in% df$A # Index a speific column
#> [1] TRUE
factor("Aa") %in% df$A # Also works if we specify the search criterion as a factor
#> [1] TRUE

Создано в 2019-04-06 пакетом Представить (v0.2.1)

0 голосов
/ 06 апреля 2019

Просто сделай:

df[which(df=="G")]
  Manufacturer
1            G

Или иди к старому доброму apply:

apply(df,2,function(x) "G"%in%x)
        Brand  Manufacturer      Calories       Protein           Fat        Sodium         Fiber Carbohydrates 
        FALSE          TRUE         FALSE         FALSE         FALSE         FALSE         FALSE         FALSE 
        Sugar     Potassium 
    FALSE         FALSE 
0 голосов
/ 06 апреля 2019

Необходимый вам стиль операций реализуется, если вы измените data.frame на data.table:

data <- as.data.table(data)
'G' == data[1, ]$Manufacturer
[1] TRUE
'G' %in% data[1, ]$Manufacturer
[1] TRUE

или изменение коэффициентов на символы:

data$Manufacturer <- as.character(data$Manufacturer)
 'G' == data[1, ]$Manufacturer
[1] TRUE
'G' %in% data[1, ]$Manufacturer
[1] TRUE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...