2017-03-22 49 views
4

我是一个新手。我有一列和许多行的数据集。我想将此列转换为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列中填充。请帮忙。

+0

但之后你只剩下3行。你的预期产量将如何? – Sotos

+0

城市和国家的名单继续。对于那个很抱歉。让我编辑问题并显示我的输出应该如何。 – Abrar

+0

您是否也许错误地将数据读入了R?你是否保证数据每5行更改一次或者可能丢失数据? – A5C1D2H2I1M1N2O1R2T1

回答

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) 

下面介绍一下当前数据的样子。仍然需要进行清理(请注意,其中一些曾在合并单元格名称从“行跨度”和种类列):

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 ... 
+0

你是超级聪明的人:-O我从那个确切的网站获取数据,并且我也使用了rvest。但是我得到的输出全部在一行中。 data =“https://en.wikipedia.org/wiki/List_of_largest_cities” data = read_html(data)data = data%>% html_nodes(“td,th”)%>% html_text()这就是我写了并获得了数据。但它全部在一个专栏中。 – Abrar

+0

@Abrar,希望它有帮助。我看到你使用了'html_text()',但你正在试图刮一张桌子。任何理由? – A5C1D2H2I1M1N2O1R2T1

+0

是的,再次感谢您的帮助。我正在尝试抓取文本,并在我提取表格时忘记将其更改为html_table()。 – Abrar

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 
+0

非常感谢。这工作像一个魅力。 – Abrar