Как я могу преобразовать столбец переменной, отличной от numeri c, в два столбца переменной numeri c? - PullRequest
2 голосов
/ 16 июня 2020

Используя R, мне нужна помощь в преобразовании нечислового c столбца в два числовых c. Я хочу разделить нечисловые c данные в столбце x, при этом значение перед da sh переходит в один столбец (Start), а значение после da sh переходит в другой столбец (End). Затем я хочу создать новый столбец numeri c, содержащий разницу между столбцами Start и End с добавлением 1 к разнице. (Столбец Diff содержит количество лет, поэтому с 2011 по 2018 будет восемь лет.)

При попытке сделать это я столкнулся с неожиданными проблемами. Во-первых, переменная x отображается как фактор. Во-вторых, данные в столбцах «Начало» и «Конец» не были числовыми c, и когда я попытался сделать их числовыми c, чтобы могло произойти вычисление Diff, я получил ошибку приведения. В-третьих, мне не удалось заставить strsplit работать.

Я проверил решения stackoverflow на предмет сопоставимых проблем, но не смог найти того, который представлял бы подходящее для меня решение.

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

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

Input

dput(df)
structure(list(x = c(NA, "1950-1960", "1975-1986", "2011-2018"
)), class = "data.frame", row.names = c(NA, -4L))

Выход

x          Start  End   Diff
1950-1960  1950   1960  11
1975-1986  1975   1986  12
2011-2018  2011   2018   8

Ответы [ 5 ]

4 голосов
/ 16 июня 2020
df$Start = as.numeric(unlist(lapply(strsplit(df$x, "-"), `[`, 1)))
df$End   = as.numeric(unlist(lapply(strsplit(df$x, "-"), `[`, 2)))
df$Diff  = df$End - df$Start + 1
df
          x Start  End Diff
1      <NA>    NA   NA   NA
2 1950-1960  1950 1960   11
3 1975-1986  1975 1986   12
4 2011-2018  2011 2018    8
3 голосов
/ 16 июня 2020

G5W отлично подходит для базового R, вот версия "tidyverse":

library(dplyr)
library(tidyr) # separate
df %>%
  filter(!is.na(x)) %>%
  tidyr::separate(x, into = c("Start", "End"), sep = "-", remove = FALSE, convert = TRUE) %>%
  mutate(Diff = End - Start + 1L)
#           x Start  End Diff
# 1 1950-1960  1950 1960   11
# 2 1975-1986  1975 1986   12
# 3 2011-2018  2011 2018    8
2 голосов
/ 16 июня 2020

Быстрое, но негибкое решение - отсчитывать годы по позициям с помощью substr():

df$Start <- as.numeric(substr(df$x, 1, 4))
df$End <- as.numeric(substr(df$x, 6, 10))
df$Diff <- df$End - df$Start + 1

df[!is.na(df$Diff), ]
          x Start  End Diff
2 1950-1960  1950 1960   11
3 1975-1986  1975 1986   12
4 2011-2018  2011 2018    8
1 голос
/ 16 июня 2020

Еще одно решение baseR:

df1[, c("Start", "End")] <- do.call(rbind, strsplit(df1$x, "-"))
df1 <- transform(type.convert(df1), Diff = End - Start + 1)

Результат

df1
#          x Start  End Diff
#1      <NA>    NA   NA   NA
#2 1950-1960  1950 1960   11
#3 1975-1986  1975 1986   12
#4 2011-2018  2011 2018    8

данные

df1 <- structure(list(x = c(NA, "1950-1960", "1975-1986", "2011-2018"
)), class = "data.frame", row.names = c(NA, -4L))
0 голосов
/ 16 июня 2020

база R, легко читается

#your data
x <- c("1950-1960", "1975-1986", "2011-2018")
df <- as.data.frame(x)

#code
df_list <- unlist(apply(df, MARGIN = 1, strsplit, "-"))
new_data <- matrix(df_list, ncol = 2,byrow = T)

#output
output <- cbind(df,new_data)

Вывод:

          x    1    2
1 1950-1960 1950 1960
2 1975-1986 1975 1986
3 2011-2018 2011 2018
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...