【问题标题】:Split a character variable in R into multiple variables将R中的字符变量拆分为多个变量
【发布时间】:2026-01-29 07:35:01
【问题描述】:

我已将一些数据(最初在 .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

感谢您的帮助。我不想手动执行此操作。

【问题讨论】:

  • 导入前的 csv 是什么样子的

标签: r dataframe variables


【解决方案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) 
)

【讨论】:

  • 如果这确实解决了您的问题,一旦您确定,请回来接受答案。 (我现在才这么说是因为你是新人,而且这是许多新用户最初不认识的礼貌/礼仪。
  • 你好。我试图为答案投票,但出现了以下弹出消息:“感谢您的反馈!声望低于 15 人的投票将被记录,但不要更改公开显示的帖子分数。”这就是“接受答案”的意思吗?我无法以明显的方式接受回复。谢谢!
  • 您好,通常作为提出问题的人,您应该能够点击灰色的勾号,然后它会变成绿色。它应该在 Up/Downvote 符号下。关于upvote,SO要求用户有一定的声誉才能做某些事情。这包括支持答案的能力。您可以单击右上角的奖杯符号,然后单击特权以了解更多信息。谢谢你让我知道,我会尽我的一份力来增加你的声誉:)
【解决方案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 & df$V1 %!in% cont]

# I do not recommend binding into a dataframe as it will be meaningless...
df2 <- cbind(Animal, Continent, Values)

我不建议将这些数据绑定到数据帧中

  • 向量的长度可能不同
  • df 假定构成观察(行)的值是相关的。

【讨论】: