将指定行转置和堆栈到R

时间:2018-02-12 15:47:03

标签: r

这个问题很难描述,但在可视化时很容易理解。因此,我建议查看我在这篇文章中链接的两张图片,以帮助理解问题。

以下是我的练习数据框的链接:

sample.data <-read.table("https://pastebin.com/uAQD6nnM", header=T, sep="\t")

我不知道为什么我会收到“比列名更多的列”的错误,因为从我的桌面使用相同的文件可以正常工作,但点击该链接会转到我的数据集。

我收到了按行排列的非常大的数据框,我希望将它放在列中,但它不是那么“简单”,因为我不一定希望(或需要)转置所有数据。

这个链接似乎与我想做的很接近,但对我来说不是正确答案Python Pandas: Transpose or Stack?

我有一个带GPS数据的标题(Coords_Y,Coords_X),后面是100多种植物物种名称的列表。如果物种存在于某个位置,则作者使用术语TRUE,如果不存在,则使用术语FALSE。

我想把这个数据集我已经发送,创建一个名为“species”的新列,它将每行中列出的每个物种叠加在一起,并且&amp;仅保留数据设置为TRUE。因此,正如我的图像所指出的,如果两个植物都存在于同一位置,那么GPS点将需要重复,因此没有数据点丢失,同时,如果某个物种出现在许多地方,物种名称需要在栏中重复多次。最后,我将有一个长度为1000行的数据集,但在我的标题行中只有5列。

before photo之前

After photo

之后

2 个答案:

答案 0 :(得分:1)

以下是使用基数R的方法:

# Notice that the link works if you include the /raw/ part
sample.data <-read.table("https://pastebin.com/raw/uAQD6nnM", header=T, sep="\t")

vars <- c("var0", "Var.1", "Coords_y", "Coords_x")

# Just selects the ones marked TRUE for each
alf <- sample.data[ sample.data$Alfaroa.williamsii, vars ]
aln <- sample.data[ sample.data$Alnus.acuminata, vars ]
alf$species <- "Alfaroa.williamsii"
aln$species <- "Alnus.acuminata"
final <- rbind(alf,aln)
final

var0 Var.1  Coords_y  Coords_x            species
192   191   7.10000 -73.00000 Alfaroa.williamsii
101   100 -13.18000 -71.59000 Alfaroa.williamsii
36    35  10.18234 -84.10683    Alnus.acuminata
38    37  10.26787 -84.05528    Alnus.acuminata

更常见的是,使用dplyrtidyr,您可以使用gather功能:

library(dplyr)
library(tidyr)

tidyr::gather(sample.data, key = "species", value = "keep", 5:6) %>%
dplyr::filter(keep) %>% 
dplyr::select(-keep)

只需将5:6替换为不同物种列的索引。

答案 1 :(得分:0)

我无法下载数据,所以我做了一些:

sample.data=data.frame(var0=c(192,36,38,101),var1=c(191,35,37,100),y=c(7.1,10.1,10.2,-13.8),x=c(-73,-84,-84,-71),
                       Alfaroa=c(T,F,F,T),Alnus=c(T,T,T,F))

提供请求结果的代码是:

dfAlfaroa=sample.data%>%filter(Alfaroa)%>%select(-Alnus)%>%rename("Species"="Alfaroa")%>%replace("Species","Alfaroa")
dfAlnus=sample.data%>%filter(Alnus)%>%select(-Alfaroa)%>%rename("Species"="Alnus")%>%replace("Species","Alnus")
rbind(dfAlfaroa,dfAlnus)