根据条件将列的子集复制到 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
对于那些在 cbind
ing
之前元素数量较少的元素
mx <- max(lengths(out_lst))
df <- do.call(cbind, lapply(out_lst, `length<-`, mx))
我的 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
对于那些在 cbind
ing
mx <- max(lengths(out_lst))
df <- do.call(cbind, lapply(out_lst, `length<-`, mx))