在R中包含长度与长形式不等的列的数据集

在R中包含长度与长形式不等的列的数据集,r,reshape,R,Reshape,编辑以澄清我希望在最终数据帧中删除NAs。NAs仅在导入时添加,以避免处理空白。除此之外,它们没有任何意义 我有一个数据集CSV文件,由字符向量列组成,每个字符向量的长度不同。我想把它们组合成长的形式。我相信长格式在我的情况下是正确的,但如果我错了,请纠正我。下面是一个简单的例子来说明我想要什么 当我导入数据时,我用NA填充缺少的空格,以避免处理过去给我带来问题的空格。以下代码模拟填充NAs后导入时数据的外观: Set1 <- c("A", "F", "R", "G", NA, NA, N

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

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

当我导入数据时,我用NA填充缺少的空格,以避免处理过去给我带来问题的空格。以下代码模拟填充NAs后导入时数据的外观:

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)
我通过组合使用堆栈函数、删除NAs和一些代码来计算出现的次数,将它们放入第一列,从而成功地实现了这一点。这似乎太麻烦了,我想知道是否有更好的方法来处理这类数据,或者有更好的方法来处理这类数据。数据框似乎不是最好的方式,因为列的长度不同,但我不知道有什么合适的替代方法

我需要此格式的数据的原因是,我可以在ggplot2中打印它。为了简单起见,我在上面的例子中遗漏了每个字母的对应数值。我的实际数据集的最终结果将是一个点图,列号在X轴上,数值在y轴上,颜色由字符向量编码


谢谢您的帮助。

如果您先将输入内容放入列表,这里还有另一个选项

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

这里还有一个选项,如果您首先将输入放入列表中

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

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

堆叠

重塑


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

堆叠

重塑


我不认为海报想要的是NA,所以添加了一个dat@hrbrmstr,我相信他说他手动添加了NAs。如果没有,你的解决方案是必要的。我建议使用do.call而不是Reduce,因为rbind已经可以使用两个以上的向量了。我还添加了一个动态计算n的代码段。感谢您和其他人的快速响应!在我的例子中,n=421。当我将n更改为该值并在数据上运行它时,会出现以下错误:getpaste0Set中出错,ind:找不到对象“Set4”。在n=3之后,它似乎失败了。我不认为这是我的数据,也不确定问题出在哪里。我不认为海报想要的是NA,所以添加了dat@hrbrmstr。我相信他说他是手动添加NAs的。如果没有,你的解决方案是必要的。我建议使用do.call而不是Reduce,因为rbind已经可以使用两个以上的向量了。我还添加了一个动态计算n的代码段。感谢您和其他人的快速响应!在我的例子中,n=421。当我将n更改为该值并在数据上运行它时,会出现以下错误:getpaste0Set中出错,ind:找不到对象“Set4”。在n=3之后,它似乎失败了。我不认为这是我的数据,也不确定问题出在哪里。他想要的是数据帧,而不是删除NAs。否则,我觉得你的陈述不清楚。这两个答案都给出了问题中显示的示例结果。他想要的是数据帧,而不是删除NAs。否则,我觉得你的陈述不清楚。这两个答案都给出了问题中显示的示例结果。
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))
transform(na.omit(stack(lapply(dat, as.character))), ind = as.numeric(ind))
na.omit(reshape(dat, dir = "long", varying = list(names(dat)))[1:2])