【问题标题】:I want to assign string value to numeric number in R [closed]我想将字符串值分配给R中的数字[关闭]
【发布时间】:2018-04-21 01:23:14
【问题描述】:

zom$country.code 是 int。
zom$Country.Code

r <-c(India,Australia,Brazil,Canada,Indonesia,NewZealand,Phillipines,Qatar,Singapore,southAfrica,SriLanka,Turkey,UAE,UnitedKingdom,UnitedStates)

我想要这样的输出:

zom$Country.Code <- c(India,Australia,Brazil,Canada,Indonesia,NewZealand,Phillipines,Qatar,Singapore,southAfrica,SriLanka,Turkey,UAE,UnitedKingdom,UnitedStates)

如何在 R 中解决这个问题。

【问题讨论】:

  • 欢迎来到 SO。这里的用户希望您 (1) 已经证明了研究,(2) 展示了代码尝试,包括 (3) 示例数据,以及 (4) 您的预期输出。请查看how to ask 问题以及如何提供minimal reproducible example/attempt
  • 特别是assign是什么意思,决定哪个国家拿什么号码的逻辑是什么,你的数据是什么格式,有多少个号码
  • data$e 应该是r 或因子水平的行索引向量,还是什么?请解释。此外,在您的数据帧上使用 str()dput() 以了解其结构,然后告诉我们了解您的问题需要了解的内容。
  • data$e 是 int 类型。
  • @vidhiamin - 第 5 次编辑中最后一行代码中的向量分配会在 R 中生成错误,因为国家名称字符串应该在引号内,正如我在对您问题的更新答案中所说明的那样。

标签: r dplyr plyr


【解决方案1】:

factor() 函数可用于将数字向量与一组标签相关联。例如:

x <- c(1,1,1,2,3,3,2,3,4,4)

theLabels <- c("India","Canada","United States","Mexico")

y <- factor(x,1:4,theLabels)
y

产生以下输出:

> y <- factor(x,1:4,theLabels)
> y
 [1] India         India         India         Canada        United States
 [6] United States Canada        United States Mexico        Mexico       

级别:印度 加拿大 美国 墨西哥

为了证明此答案适用于 OP 第五次编辑中提供的数据:

r <-c("India","Australia","Brazil","Canada","Indonesia","NewZealand",
      "Phillipines","Qatar","Singapore","southAfrica","SriLanka","Turkey","UAE","UnitedKingdom","UnitedStates")
zom<- data.frame(Country.Code=c(1,14,30,37,94,148,162,166,184,189,191,208,214,215,216))

zom$Country.Code <- factor(zom$Country.Code,
                           levels = c(1,14,30,37,94,148,162,166,184,189,191,208,214,215,216),
                           labels = r)

zom$Country.Code

...和输出:

> zom$Country.Code
 [1] India         Australia     Brazil        Canada        Indonesia     NewZealand    Phillipines   Qatar        
 [9] Singapore     southAfrica   SriLanka      Turkey        UAE           UnitedKingdom UnitedStates 
15 Levels: India Australia Brazil Canada Indonesia NewZealand Phillipines Qatar Singapore southAfrica SriLanka Turkey ... UnitedStates

注意:一旦将原始代码转换为因子,基础代码就会丢失,因为因子的副作用是因子级别变为从 1 到唯一标签数量的有序列表与因素有关。

factor() 方法的替代方法是创建国家名称和代码的查找表,并将其与原始数据合并。这种方法保留了Country.Code 的原始值。

为了说明,我们将创建一个包含来自 OP 的多行 Country.Code 的数据框,并通过 dplyr::inner_join() 将其与查找表合并。然后我们将生成Country.NameCountry.Code 的交叉表来说明连接过程的准确性。

library(dplyr)
# first, build a data frame containg multiple rows with same country code
zom<- data.frame(Country.Code=c(1,14,30,37,94,148,162,166,184,189,191,208,214,215,216,
                                1,14,30,37,94,148,162,166,184,189,191,208,214,215,216,
                                1,14,30,37,94,148,162,166,184,189,191,208,214,215,216))
# second, create lookup table of codes and names, one row per country
countryNames <- data.frame(Country.Code=c(1,14,30,37,94,148,162,166,184,189,191,208,214,215,216),
                           Country.Name= c("India","Australia","Brazil","Canada","Indonesia","NewZealand",
                                           "Phillipines","Qatar","Singapore","southAfrica","SriLanka","Turkey","UAE","UnitedKingdom","UnitedStates"),
     stringsAsFactors=FALSE)

# use dplyr::inner_join() to join country names 
mergedData <- zom %>% inner_join(countryNames)
table(mergedData$Country.Name,mergedData$Country.Code)

...和输出:

> table(mergedData$Country.Name,mergedData$Country.Code)

                1 14 30 37 94 148 162 166 184 189 191 208 214 215 216
  Australia     0  3  0  0  0   0   0   0   0   0   0   0   0   0   0
  Brazil        0  0  3  0  0   0   0   0   0   0   0   0   0   0   0
  Canada        0  0  0  3  0   0   0   0   0   0   0   0   0   0   0
  India         3  0  0  0  0   0   0   0   0   0   0   0   0   0   0
  Indonesia     0  0  0  0  3   0   0   0   0   0   0   0   0   0   0
  NewZealand    0  0  0  0  0   3   0   0   0   0   0   0   0   0   0
  Phillipines   0  0  0  0  0   0   3   0   0   0   0   0   0   0   0
  Qatar         0  0  0  0  0   0   0   3   0   0   0   0   0   0   0
  Singapore     0  0  0  0  0   0   0   0   3   0   0   0   0   0   0
  southAfrica   0  0  0  0  0   0   0   0   0   3   0   0   0   0   0
  SriLanka      0  0  0  0  0   0   0   0   0   0   3   0   0   0   0
  Turkey        0  0  0  0  0   0   0   0   0   0   0   3   0   0   0
  UAE           0  0  0  0  0   0   0   0   0   0   0   0   3   0   0
  UnitedKingdom 0  0  0  0  0   0   0   0   0   0   0   0   0   3   0
  UnitedStates  0  0  0  0  0   0   0   0   0   0   0   0   0   0   3
>

【讨论】:

  • 如何将 country.name 列添加到另一个数据集中?例如,我有一个名为 qwe 的数据集,我想添加一个存储国家/地区的列。名称值。
  • @vidhiamin - 数据框是否已经包含 country.code 列?
  • 是的。@ Len Greski
  • @vidhiamin 那么上面在inner_join() 方法中列出的代码将起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多