#r #dataframe #variables
#r #фрейм данных #переменные
Вопрос:
Я импортировал некоторые данные (которые изначально находятся в файле .csv) в R и имею следующий фрейм данных только с одной переменной — V1. Существуют десятки тысяч элементов (строк) с приведенным ниже составом данных. V1 — это символьная переменная, но она содержит как слова, так и числа, которые я хотел бы разделить на три переменные, как показано внизу.
V1
"Tigers"
"Africa"
"23"
"North America"
"15"
"Asia"
"276"
"Elephants"
"Africa"
"233"
"North America"
"0"
"Asia"
"554"
Вот как я хотел бы, чтобы выглядел полный df — три переменные с именами Animal, Continent, Value . Значение должно быть числовым (или целочисленной переменной), а две другие переменные могут быть либо факторами, либо символами.
Animal Continent Value
Tigers Africa 23
Tigers North America 15
Tigers Asia 276
Elephants Africa 233
Elephants North America 0
Elephants Asia 554
Спасибо за любую помощь. Я не хочу делать это вручную.
Комментарии:
1. как выглядит csv перед его импортом
Ответ №1:
Я думаю, это должно сработать:
library(data.table)
v <- c("Tigers",
"Africa",
"23",
"North America",
"15",
"Asia",
"276",
"Elephants",
"Africa",
"233",
"North America",
"0",
"Asia",
"554")
Animal <- v[seq(1, length(v), 7)]
n <- 3
Animal <- c(rep(Animal[1], n), rep(Animal[2], n))
rest <- v[-seq(1, length(v), 7)]
Continent <- rest[seq(1, length(rest), 2)]
Value <- rest[seq(2, length(rest), 2)]
df <- data.table(
Animal = Animal,
Continent = Continent,
Value = as.numeric(Value)
)
Комментарии:
1. Если это решит ваш вопрос, как только вы будете уверены в этом, пожалуйста, вернитесь и примите ответ. (Я говорю это только сейчас, потому что вы новичок, и это вежливость / этикет, ТАК что многие новые пользователи изначально не распознают.
2. Здравствуйте. Я попытался проголосовать за ответ, но появилось следующее всплывающее сообщение: «Спасибо за отзыв! Голоса, поданные лицами с репутацией менее 15, записываются, но не изменяют публично отображаемый результат публикации «. Это то, что подразумевается под «принятием ответа»? Я не могу очевидным способом принять ответ. Спасибо!
3. Привет, обычно, как тот, кто задал вопрос, вы должны иметь возможность щелкнуть по символу серой галочки, который затем станет зеленым. Она должна быть под символом Up / Downvote . Что касается upvote, SO требует, чтобы пользователи имели определенную репутацию для выполнения определенных действий. Это включает в себя возможность голосовать за ответы. Вы можете нажать на символ трофея в правом верхнем углу, а затем на привилегии, чтобы узнать больше. Спасибо, что сообщили мне, я сделаю все возможное, чтобы повысить вашу репутацию с помощью upvote 🙂
Ответ №2:
Я не могу полностью понять вопрос. Я не мог сказать вам, как восстановить df из одного столбца, казалось бы, случайных данных. Я бы посоветовал вам проверить свои методы импорта данных. Тем не менее, если вы заинтересованы в извлечении некоторой информации из ваших данных, я бы просто извлек предметы в векторы
# Given
`%!in%` <- Negate(`%in%`)
df <- data.frame(V1 = c("Tigers", "Africa", "23", "North America", "15", "Asia", "276",
"Elephants", "Africa", "233", "North America", "0", "Asia", "554"),
stringsAsFactors = FALSE)
# Vector to ID continents
cont <- c("Africa", "Asia", "Europe", "North America", "South America", "Oceania", "Antarctica")
# subset continents
Continent <- df$V1[df$V1 %in% cont]
# Extract digits
Values <- as.numeric(gsub("[^[:digit:]] ", '\1', df$V1))
Values <- Values[!is.na(Values)]
# Remove "conitnents" and "values" and you are left with "animals"
Animal = df$V1[df$V1 %!in% Values amp; df$V1 %!in% cont]
# I do not recommend binding into a dataframe as it will be meaningless...
df2 <- cbind(Animal, Continent, Values)
Я бы не рекомендовал связывать эти данные в dataframe
- векторы, вероятно, будут отличаться по длине
- df предполагает, что значения, составляющие наблюдение (строку), связаны.