1

我有一个 .csv 文件,其中包含 22.388 行以逗号分隔的数字。我想分别找到每一行的数字对的所有可能组合,并将它们逐对列出,这样我就可以将它们直观地表示为集群。

我的文件中两行的示例是
"2, 13"
"2, 8, 6"

当我使用 str() 函数时,R 表示文件包含因子。我想它需要是整数,但我需要将行分开,因此我将每一行都包裹在“”中。

我想要这样的每一行的可能组合。

2, 13
2, 8
2, 6
8, 6

我已经从@flodel 那里得到了答案,说

示例输入 - 将 textConnection(...) 替换为您的 csv 文件名。

csv <- textConnection("2,13
2,8,6")

这会将输入读入值列表:

input.lines  <- readLines(csv)
input.values <- strsplit(input.lines, ',')

这将创建一个嵌套的对列表:

pairs <- lapply(input.values, combn, 2, simplify = FALSE)
This puts everything in a nice matrix of integers:

pairs.mat <- matrix(as.integer(unlist(pairs)), ncol = 2, byrow = TRUE)
pairs.mat

但是我需要该函数分别运行我的 .csv 文件中的每一行,所以我认为我需要使用该函数执行一个 for 循环 - 我只是无法理解它。

提前致谢。

4

1 回答 1

0

不确定你到底在追求什么,但可能是这样的:

dat <- readLines(n=2) #read in your data
2, 13 
2, 8, 6

## split each string on "," and then remove white space
## and put into a list with lapply

dat2 <- lapply(dat, function(x) {   
    as.numeric(gsub("\\s+", "", unlist(strsplit(x, ","))))
})


## find all combinations using outer with outer (faster 
## than expand.grid and we can take just a triangle)

dat3 <- lapply(dat2, function(x) {
    y <- outer(x, x, paste)
    c(y[upper.tri(y)])
})

## then split on the spaces and convert back to numeric
## stored as a list

lapply(strsplit(unlist(dat3), " "), as.numeric)

## > lapply(strsplit(unlist(dat3), " "), as.numeric)
## [[1]]
## [1]  2 13
## 
## [[2]]
## [1] 2 8
## 
## [[3]]
## [1] 2 6
## 
## [[4]]
## [1] 8 6
于 2013-05-09T14:18:48.987 回答