所以,我有一个像这样的数据框,
1 2 110 10 NA NA
2 3 101 100 NA NA
3 4 10 NA NA NA
3 2 110 100 101 NA
.................
现在,我想把这个数据帧分成110,10,101,100,10,101个别文件。 每个文件都包含其中的前两列。 例如, 文件110将包含,
1 2
3 2
文件10将包含
1 2
3 4
像这样,我想分开它。我知道如何仅基于列值来划分它,但由于文件包含多个列,我不知道该怎么做?
任何帮助,将不胜感激。
我能够为单列创建的代码是,然后创建文本文件,
X <- split(myFile, myFile[, 4])
invisible(lapply(names(X), function(y)
write.table(X[[y]], file = paste0(y, ".txt"))))
答案 0 :(得分:1)
以长而不是宽的形式制作数据集,然后split
:
vals <- apply(dat[3:6], 1, function(x) x[!is.na(x)] )
df <- cbind(dat[1:2][rep(rownames(dat), sapply(vals,length)),], val=unlist(vals))
split(df, intm$val)
#$`10`
# V1 V2 val
#1.1 1 2 10
#3 3 4 10
#
#$`100`
# V1 V2 val
#2.1 2 3 100
#4.1 3 2 100
#
#$`101`
# V1 V2 val
#2 2 3 101
#4.2 3 2 101
#
#$`110`
# V1 V2 val
#1 1 2 110
#4 3 2 110
答案 1 :(得分:0)
你可以这样做:
dat是您的data.frame
dat110 <- dat[which(dat[, 3:4] == 110, arr.ind = T)[, 1], 1:2]
首先我们查找数组索引,列3:4的值为110#(dat [,3:4] == 110,arr.ind = T)(这里你应该将3:4更改为你的索引)列)
接下来我们只选择行#,它是[,1],然后是(...)
最后我们选择前两列dat,但只选择前一节#dat中所选择的行[which(...),1:2]
您可以使用for循环来更改条件值,即110。
我的例子:
dat <- data.frame(x=1:3,y=2:4,z=0:2,w=2:4)
for(i in unique(unlist(dat[,3:4])))
{
tmp <- dat[which(dat[, 3:4] == i, arr.ind = T)[, 1], 1:2]
print(i)
print(tmp)
}
答案 2 :(得分:0)
您也可以尝试:
library(dplyr)
library(tidyr)
dat1 <- dat %>%
mutate(indx=row_number()) %>%
gather(Var, Val, V3:V6) %>%
filter(!is.na(Val))%>%
arrange(Val, indx) %>%
select(-indx, -Var)
lst1 <- split(dat1, dat1$Val)
lst1
#$`10`
# V1 V2 Val
#1 1 2 10
#2 3 4 10
#$`100`
# V1 V2 Val
#3 2 3 100
#4 3 2 100
#$`101`
# V1 V2 Val
#5 2 3 101
#6 3 2 101
#$`110`
# V1 V2 Val
#7 1 2 110
#8 3 2 110
如果您需要将它们作为global environment
中的单个数据集,则一个选项为list2env
,或者您可以使用assign
(但不建议这样做,因为它会在全球范围内创建大量对象ENV)。相反,您可以在列表本身内进行所有必要的计算,并使用lapply
和write.table/write.csv
一起保存为单个文件。但是,如果您需要作为单独的数据集:
list2env(setNames(lst1, paste("dat", names(lst1), sep="_")), envir=.GlobalEnv)
<environment: R_GlobalEnv>
dat_10
# V1 V2 Val
#1 1 2 10
#2 3 4 10
dat <- structure(list(V1 = c(1L, 2L, 3L, 3L), V2 = c(2L, 3L, 4L, 2L),
V3 = c(110L, 101L, 10L, 110L), V4 = c(10L, 100L, NA, 100L
), V5 = c(NA, NA, NA, 101L), V6 = c(NA, NA, NA, NA)), .Names = c("V1",
"V2", "V3", "V4", "V5", "V6"), class = "data.frame", row.names = c(NA,
-4L))