Как использовать функцию «минимума» в R, учитывая эти два столбца в кадре данных? - PullRequest
0 голосов
/ 24 мая 2018

Учитывая следующий фрейм данных:

df <- data.frame(c("1990, 1991", "1997, 2004", "2005"), c("1991, 1999", "1994", "1995, 2011"))

Я хочу создать 3-й столбец справа во фрейме данных, который вставляет самый низкий год в строке на основе двух столбцов.

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

Итак, в первой строке R проанализирует годы:

1990, 1991, 1991 и 1999, а затем напишите 1990 в третьем столбце, поскольку он является самым низким из всех.

Финальная таблица должна выглядеть следующим образом:

df <- data.frame(c("1990, 1991", "1997, 2004", "2005"), c("1991, 1999", "1994", "1995, 2011"), c("1990", "1994", "1995"))

Ответы [ 4 ]

0 голосов
/ 26 мая 2018

Другая базовая опция:

df$result <- sapply(strsplit(gsub(",","",do.call(paste,df))," "),min)

df
#          one        two result
# 1 1990, 1991 1991, 1999   1990
# 2 1997, 2004       1994   1994
# 3       2005 1995, 2011   1995

здесь результат - символ (min работает с символами), оберните as.numeric вокруг вызова sapply, если это проблема.

0 голосов
/ 24 мая 2018

Решение, использующее функцию splitstackshape::cSplit вместе с dplyr как:

library(splitstackshape)
library(dplyr)

df$minval <- df %>% cSplit(c("one", "two")) %>%
  mutate_if(is.character, as.numeric) %>%
  mutate(minval = apply(., 1,min, na.rm = TRUE)) %>%
  select(minval)

df
#          one        two minval
# 1 1990, 1991 1991, 1999   1990
# 2 1997, 2004       1994   1994
# 3       2005 1995, 2011   1995

Данные: Я изменил пример данных, чтобы предоставить имена столбцов.(который не нужен для решения, но помогает в эстетическом взгляде на ответ)

df <- data.frame(one = c("1990, 1991", "1997, 2004", "2005"), 
               two = c("1991, 1999", "1994", "1995, 2011"))
0 голосов
/ 24 мая 2018

Это еще один способ использования dplyr

library(dplyr)
df = data.frame(x = c("1990, 1991", "1997, 2004", "2005"), 
           y = c("1991, 1999", "1994", "1995, 2011"))
df

#>           x          y
#>1 1990, 1991 1991, 1999
#>2 1997, 2004       1994
#>3       2005 1995, 2011

df %>%
  rowwise() %>%
  mutate(z = paste(x, y, sep = ",") %>% 
               str_split(",") %>% 
               combine() %>% 
               min())

#>Source: local data frame [3 x 3]
#>Groups: <by row>

#>  # A tibble: 3 x 3
#>           x           y          z    
#>        <fct>       <fct>      <chr>
#>1  1990, 1991  1991, 1999       1990 
#>2  1997, 2004        1994       1994 
#>3        2005  1995, 2011       1995 
0 голосов
/ 24 мая 2018

Вот подход apply

df$result <- apply(df, 1, function(x) min(as.numeric(unlist(strsplit(paste(x, collapse=", "), ", ")))))

Сверните 2 столбца в одну строку, используя

paste(x, collapse=", ")

Разделите полученную строку на вектор

unlist(strsplit(..., ", "))

Найти минимальное число

min(as.numeric(...))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...