根据条件将列的子集复制到 R 中的另一个数据框

Copy a subset of a column, based on conditions, to another dataframe in R

我的 R 技能非常有限,在寻找解决方案几个小时后,我找不到可行的选项。 我有几个大数据表。从每个列中,我想将列的一部分复制到数据框中,以在那里填充列。 我的数据表(tabn1、tabn2、tabn3)都具有相同的格式,但长度不同。每个子集将具有不同的行数。我希望用 NA 填充空白空间。我连第一列都复制不了,所以后面的都是下一个问题!

Ro  Co  Red Green   Yellow
1   3   123 999 265
1   3   223 875 5877
1   4   21488   555 478
1   4   558 23698   5558
2   3   558 559 148
2   3   4579    557 59
2   4   1489    545 2369
2   4   123 999 265
3   3   558 559 148
3   3   558 23698   5558
3   4   4579    557 59
3   4   1478 4579   557
4   3   1488    555 478
4   3   1478    2945    5889
4   4   448 259 4548
4   4   26576   158 15

我的新数据框列名:

cls <- c("n1","n2","n3")

我用列名创建了一个数据框:

df <- setNames(data.frame(matrix(ncol=3)),cls)

对于我的每个表,我只想对 Ro > = 3、Co = 3、“红色”列进行子集化 我试过:

sub1 <- (filter(tabn1, tabn1$Ro >=3 | tabn$Co == 3)
df$n1 <- sub1$Red

> Error in `$<-.data.frame`(`*tmp*`, n1, value = c(183.94, 180.884,  : 
  replacement has 32292 rows, data has 1

还有:

df$n1 <- cut(sub1$Red)

> Error in cut.default(sub1$Red) : 
  argument "breaks" is missing, with no default

我尝试使用 df 作为数据表而不是数据框,但也遇到了以下错误:

df <- setNames(data.table(matrix(ncol=3)),cls)
df$n1 <- sub1$Red
> Error in set(x, j = name, value = value) : 
  Supplied 32292 items to be assigned to 1 items of column 'nn1'. If you wish to 'recycle' the RHS please use rep() to make this intent clear to readers of your code.

我随后会尝试子集化并从 tabn2 复制到 df$n2,等等。如上所述,原始表格具有不同的长度。 提前致谢!

问题是 'df' 和 'sub1' 中的行数不同。 'df' 创建了 1 行。相反,我们可以直接从 'sub1' 本身

创建 'df'
df <- sub1['Red']
names(df) <- cls[1]

此外,另一种创建 data.frame 的方法是同时指定 nrow

df <- as.data.frame(matrix(nrow = nrow(sub1), ncol = length(cls)),
       dimnames = list(NULL, cls))

关于cut的第二个错误,它需要breaks。要么我们指定中断次数

cut(sub1$Red, breaks = 3)

或者断点向量

cut(sub1$Red, breaks = c(-Inf, 100, 500, 1000, Inf))

如果有很多 'tabn' 个对象,将它们放入 list,用 lapply

循环遍历 list
lst1 <- mget(ls(pattern = '^tabn\d+$'))
out_lst <- lapply(lst1, function(x) subset(x, Ro >=3 | Co == 3)$Red)

有可能在subset设置和选择'Red'列之后,元素的数量可能会有所不同。如果 lengths 不同,一个选项是在末尾填充 NA 对于那些在 cbinding

之前元素数量较少的元素
mx <- max(lengths(out_lst))
df <- do.call(cbind, lapply(out_lst, `length<-`, mx))