将一列转换为多列

时间:2017-03-22 15:24:32

标签: r

我是新手。我有一个包含一列和多行的数据集。我想将此列转换为5列。例如,我的数据集如下所示:

Column
----
City
Nation
Area
Metro Area
Urban Area
Shanghai
China
24,000,000
1230040
4244234
New york 
America 
343423  
23423434    
343434
Etc

输出应该如下所示

City | Nation | Area | Metro City | Urban Area
----- -------  ------ ------------ -----------
Shangai China  2400000  1230040     4244234
New york America 343423  23423434    343434

数据集的前5行(城市,国家,区域等)需要是5列的名称,我希望在这5列下填充其余数据。请帮忙。

2 个答案:

答案 0 :(得分:5)

以下是单行(考虑到您的column是字符,即df$column <- as.character(df$column)

setNames(data.frame(matrix(unlist(df[-c(1:5),]), ncol = 5, byrow = TRUE)), c(unlist(df[1:5,])))

#      City  Nation       Area Metro_Area Urban_Area
#1 Shanghai   China 24,000,000    1230040    4244234
#2 New_york America     343423   23423434     343434

答案 1 :(得分:4)

我打算走出困境并猜测你所追踪的数据来自网址:https://en.wikipedia.org/wiki/List_of_largest_cities

如果是这种情况,我建议您实际尝试重新读取数据(不知道如何将数据放入R中),因为这可能会让您的生活更轻松。

以下是一种读取数据的方法:

library(rvest)

URL <- "https://en.wikipedia.org/wiki/List_of_largest_cities"
XPATH <- '//*[@id="mw-content-text"]/table[2]'

cities <- URL %>% 
  read_html() %>% 
  html_nodes(xpath=XPATH) %>% 
  html_table(fill = TRUE)

这是目前数据的样子。仍然需要清理(注意一些列在“rowspan”和各种类型的合并单元格中有名称):

head(cities[[1]])
##       City     Nation Image     Population        Population                            Population
## 1                     Image    City proper Metropolitan area                         Urban area[7]
## 2 Shanghai      China        24,256,800[8]     34,750,000[9]                         23,416,000[a]
## 3  Karachi   Pakistan       23,500,000[10]    25,400,000[11]                            25,400,000
## 4  Beijing      China       21,516,000[12]    24,900,000[13]                            21,009,000
## 5    Dhaka Bangladesh       16,970,105[14]        15,669,000 18,305,671[15][not in citation given]
## 6    Delhi      India       16,787,941[16]        24,998,000                        21,753,486[17]

从那里,清理可能就像:

cities <- cities[[1]][-1, ]
names(cities) <- c("City", "Nation", "Image", "Pop_City", "Pop_Metro", "Pop_Urban")
cities["Image"] <- NULL
head(cities)
cities[] <- lapply(cities, function(x) type.convert(gsub("\\[.*|,", "", x)))
head(cities)
#       City     Nation Pop_City Pop_Metro Pop_Urban
# 2 Shanghai      China 24256800  34750000  23416000
# 3  Karachi   Pakistan 23500000  25400000  25400000
# 4  Beijing      China 21516000  24900000  21009000
# 5    Dhaka Bangladesh 16970105  15669000  18305671
# 6    Delhi      India 16787941  24998000  21753486
# 7    Lagos    Nigeria 16060303  13123000  21000000
str(cities)
# 'data.frame': 163 obs. of  5 variables:
#  $ City     : Factor w/ 162 levels "Abidjan","Addis Ababa",..: 133 74 12 41 40 84 66 148 53 102 ...
#  $ Nation   : Factor w/ 59 levels "Afghanistan",..: 13 41 13 7 25 40 54 31 13 25 ...
#  $ Pop_City : num  24256800 23500000 21516000 16970105 16787941 ...
#  $ Pop_Metro: int  34750000 25400000 24900000 15669000 24998000 13123000 13520000 37843000 44259000 17712000 ...
#  $ Pop_Urban: num  23416000 25400000 21009000 18305671 21753486 ...