这个问题很难描述,但在可视化时很容易理解。因此,我建议查看我在这篇文章中链接的两张图片,以帮助理解问题。
以下是我的练习数据框的链接:
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列。
在之前
之后
答案 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
更常见的是,使用dplyr
和tidyr
,您可以使用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)