数据集包含R中长度不等的列

时间:2014-03-24 16:41:15

标签: r reshape

编辑澄清我希望在最终数据框中删除NAs。仅在导入时添加了NA以避免处理空白。除此之外,它们没有任何意义。

我有一个由字符向量列组成的数据集(CSV文件),每个字符向量的长度都不同。我想将它们组合成长形。 (我相信"长形式"在我的情况下是正确的术语但如果我错了请纠正我)。下面是一个简单的例子来说明我想要的东西。

当我导入数据时,我用NA填充缺失的空格,以避免处理过去导致我出现问题的空白。以下代码模拟填充NA后数据在导入时的外观:

Set1 <- c("A", "F", "R", "G", NA, NA, NA, NA)
Set2 <- c("G", "Q", "U", "I", "G", "D", "K", "B")
Set3 <- c("V", "S", "M", "J", "K", "L", NA, NA)
dat <- data.frame(Set1, Set2, Set3)

这给出了以下R控制台输出:

  Set1 Set2 Set3
1    A    G    V
2    F    Q    S
3    R    U    M
4    G    I    J
5 <NA>    G    K
6 <NA>    D    L
7 <NA>    K <NA>
8 <NA>    B <NA>

我希望数据以双列格式显示,并删除NA。第一列将包含字母出现的列号。第二列将包含彼此堆叠的每个列。我相信这被称为长形式,但我可能会弄错。它看起来像这样:

   Col Char
1    1    A
2    1    F
3    1    R
4    1    G
5    2    G
6    2    Q
7    2    U
8    2    I
9    2    G
10   2    D
11   2    K
12   2    B
13   3    V
14   3    S
15   3    M
16   3    J
17   3    K
18   3    L

我已经设法通过组合stack函数,删除NAs和一些代码来计算将它们放入第一列的出现次数。这看起来过于繁琐,我想知道是否有更好的方法来做这个或更好的方法来处理我必须处理的数据类型。数据框似乎不是最佳方式,因为列的长度不同,但我不知道任何合适的替代方案。

我需要这种格式的数据的原因是我可以在ggplot2中绘制它。为简单起见,我在上面的示例中省略了每个字母的实际对应数值。我的实际数据集的最终结果将是一个点图,其中X轴上的列号,y轴上的数值,以及由字符向量编码的颜色。

感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

如果您先将输入放入列表中,这是另一个选项。

sets <- list(Set1 = c("A", "F", "R", "G"),
             Set2 = c("G", "Q", "U", "I", "G", "D", "K", "B"),
             Set3 = c("V", "S", "M", "J", "K", "L"))

data.frame(Col=rep(seq_along(sets), sapply(sets, length)), Char=unlist(sets))

答案 1 :(得分:2)

n <- 3 # How many Set1, Set2, etc. there are. Make sure these have no NAs yet.
# If you do not know how many there are (e.g. another user is providing them) 
# then use this:
# n <- max(as.integer(gsub('Set', '', ls()[grepl('^Set[0-9]+$', ls())])))
dat <- do.call(rbind, lapply(seq_len(n), function(ind) {
  set <- get(paste0("Set", ind)) # Fetch SetX where X is the current index
  set <- set[!is.na(set)] # remove NAs just in case. Delete this line if no Sets have any
  data.frame(Col = rep.int(ind, length(set)), Char = set)
}))

答案 2 :(得分:1)

以下是一些产生2列输出的方法,如给出dat的问题所示:

<强>堆

transform(na.omit(stack(lapply(dat, as.character))), ind = as.numeric(ind))

<强>重塑

na.omit(reshape(dat, dir = "long", varying = list(names(dat)))[1:2])