如何根据列中的值划分数据帧?

时间:2014-09-24 06:06:11

标签: r

所以,我有一个像这样的数据框,

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"))))

3 个答案:

答案 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)。相反,您可以在列表本身内进行所有必要的计算,并使用lapplywrite.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))