我有一个数据文件,我需要分解成多个,更小的数据格式。
有一个整数索引,从1开始并计数。当它重置为1时,我需要开始创建一个新的dataframe。
df <- cbind(c(1,2,3,4,5,1,2,3,4), c("a","b","c","d","e","f","g","h","i"))
#end results should be:
df1 <- df[1:5, ]
df2 <- df[6:9, ]
如何以编程方式完成此操作?我可以找到所有的“1”都在哪里,但我如何逐行并将其分解成不同的数据格式呢?
发布于 2020-11-19 08:02:59
在您的示例中,df
是一个字符矩阵,而不是一个data.frame
。要定义data.frame
对象,请使用例如data.frame(index = c(1,2,3,4,5,1,2,3,4), value = c("a","b","c","d","e","f","g","h","i")
查找每个组的第一个值的索引,然后按组拆分。您不需要执行任何逐行操作。
df <- data.frame(index = c(1,2,3,4,5,1,2,3,4), value = c("a","b","c","d","e","f","g","h","i"))
split(df, cumsum(df$index == 1))
结果是data.frame
对象的列表:
$`1`
index value
1 1 a
2 2 b
3 3 c
4 4 d
5 5 e
$`2`
index value
6 1 f
7 2 g
8 3 h
9 4 i
发布于 2020-11-19 07:52:18
使用索引和循环来尝试这种方法。我们创建i1
来存储有1
的行。然后计算i2
中的最终位置。之后,我们创建一个列表并使用一个循环来存储新的数据。最后,我们使用list2env
为环境分配名称和发布。在这里,代码:
#Create index
i1 <- which(df[,1]=='1')
i2 <- i1[-1]-1
#Test for dim
if(length(i2==1)){i2 <- c(i2,nrow(df))}
#Create a list
List <- list()
#Loop
for(j in 1:length(i1))
{
List[[j]] <- df[i1[j]:i2[j],]
}
#Assign names
names(List) <- paste0('df',1:length(List))
#Set to envir
list2env(List,envir = .GlobalEnv)
https://stackoverflow.com/questions/64915006
复制