R:数据框列表上的嵌套 if else 语句
R: Nested if else statements on list of data frames
我有一个数据框列表,它们都具有相同的结构。我需要根据另一个变量的值在每个数据框中重新编码一个变量。我在这里找到了让我接近的解决方案,但几个小时后,我仍然做不到。
我的数据框是这样的:
$Test14
Class Total
1 201 1
2 203 14
3 204 3
4 205 7
5 206 7
6 207 1
7 211 2
8 212 1
9 213 16
10 288 27
11 299 9
12 517 1
13 592 2
14 593 8
每个 Class 代码都属于一个更大的 MajorClass 类别。我正在尝试附加另一个 MajorClass 以便我可以将数据转换为简单的英语。所以像这样:
$Test14
Class Total MajorClass
1 201 1 Reg Residential
2 203 14 Reg Residential
3 204 3 Reg Residential
4 205 7 Reg Residential
5 206 7 Reg Residential
6 207 1 Reg Residential
7 211 2 Reg Residential
8 212 1 Reg Residential
9 213 16 NonReg Residential
10 288 27 NonReg Residential
11 299 9 NonReg Residential
12 517 1 Commercial
13 592 2 Commercial
14 593 8 Industrial
我的想法是尝试使用 lapply
代替 for 循环来获取每一行的 MajorClass,然后使用 cbind
将它们拉回一起之后。我使用的是以下代码:
> MajorClass <- lapply(mydata, function(i) {
> i$MajorClass <- ""
> if (i$Class == '200' || i$Class == '202' || i$Class == '203' || i$Class == '204' || i$Class == '205' || i$Class == '206' || i$Class ==
> '207' || i$Class == '208' || i$Class == '209' || i$Class == '210' ||
> i$Class == '211' || i$Class == '212' || i$Class == '216' || i$Class ==
> '234' || i$Class == '278' || i$Class == '295')
> i$MajorClass <- "Reg Residential"
> else
> if (i$Class == '239' || i$Class == '240' || i$Class == '241' || i$Class == '201' || i$Class == '213' || i$Class == '224' || i$Class
> == '225' || i$Class == '236' || i$Class == '288' || i$Class == '290' || i$Class == '297' || i$Class == '299')
> i$MajorClass <- "NonReg Residential" ... and so on ...
但它 returns 每个数据帧中的最后一条记录只有一个值。我对此尝试了多种变体,并尝试使用 for 循环,但都无济于事。另外,我的(有限的)理解是使用 apply 函数而不是 for 循环更有效。
如有任何帮助或指出正确的方向,我们将不胜感激。正如我所说,我在这个网站和其他网站上搜索了很多,接近但还不够接近。再次感谢!
您要做的是将一个 table 的值匹配到另一个 table,这可以通过 join
轻松完成。这通过一个公共(且同名)列匹配两个 table 的元素。
为此,您需要一个参考 table,其中每个不同的 class
都有其关联的 MajorClass
。 (我生成了一些虚拟数据)
#install.packages("dplyr")
library(dplyr)
test <- list(test14 = data.frame(class = c("201", "203","205"), total=c(1,3,7),
stringsAsFactors = F))
reference_table <- data.frame(class = c("201","202","203","204","205"),
MajorClass=c("Reg","Reg","NonReg","comercial","comercial"),
stringsAsFactors = F)
现在您可以使用 lapply
将其匹配到每个数据框
output.list <- lapply(test, function(x) left_join(x, reference_table, by="class"))
$test14
class total MajorClass
1 201 1 Reg
2 203 3 NonReg
3 205 7 comercial
或者将列表中的所有数据框合并为一个(如果它们具有相同的结构,则可以这样做)然后一次匹配所有 table。
data <- bind_rows(test)
output <- left_join(data, reference_table, by="class")
class total MajorClass
(chr) (dbl) (chr)
1 201 1 Reg
2 203 3 NonReg
3 205 7 comercial
我假设您有 Vicent Boned 描述的参考 table。您可以使用 base R 来完成这项工作。
test$MajorClass <- factor(test$class, levels=reference_table$class, labels=reference_table$MajorClass)
我有一个数据框列表,它们都具有相同的结构。我需要根据另一个变量的值在每个数据框中重新编码一个变量。我在这里找到了让我接近的解决方案,但几个小时后,我仍然做不到。
我的数据框是这样的:
$Test14
Class Total
1 201 1
2 203 14
3 204 3
4 205 7
5 206 7
6 207 1
7 211 2
8 212 1
9 213 16
10 288 27
11 299 9
12 517 1
13 592 2
14 593 8
每个 Class 代码都属于一个更大的 MajorClass 类别。我正在尝试附加另一个 MajorClass 以便我可以将数据转换为简单的英语。所以像这样:
$Test14
Class Total MajorClass
1 201 1 Reg Residential
2 203 14 Reg Residential
3 204 3 Reg Residential
4 205 7 Reg Residential
5 206 7 Reg Residential
6 207 1 Reg Residential
7 211 2 Reg Residential
8 212 1 Reg Residential
9 213 16 NonReg Residential
10 288 27 NonReg Residential
11 299 9 NonReg Residential
12 517 1 Commercial
13 592 2 Commercial
14 593 8 Industrial
我的想法是尝试使用 lapply
代替 for 循环来获取每一行的 MajorClass,然后使用 cbind
将它们拉回一起之后。我使用的是以下代码:
> MajorClass <- lapply(mydata, function(i) {
> i$MajorClass <- ""
> if (i$Class == '200' || i$Class == '202' || i$Class == '203' || i$Class == '204' || i$Class == '205' || i$Class == '206' || i$Class ==
> '207' || i$Class == '208' || i$Class == '209' || i$Class == '210' ||
> i$Class == '211' || i$Class == '212' || i$Class == '216' || i$Class ==
> '234' || i$Class == '278' || i$Class == '295')
> i$MajorClass <- "Reg Residential"
> else
> if (i$Class == '239' || i$Class == '240' || i$Class == '241' || i$Class == '201' || i$Class == '213' || i$Class == '224' || i$Class
> == '225' || i$Class == '236' || i$Class == '288' || i$Class == '290' || i$Class == '297' || i$Class == '299')
> i$MajorClass <- "NonReg Residential" ... and so on ...
但它 returns 每个数据帧中的最后一条记录只有一个值。我对此尝试了多种变体,并尝试使用 for 循环,但都无济于事。另外,我的(有限的)理解是使用 apply 函数而不是 for 循环更有效。
如有任何帮助或指出正确的方向,我们将不胜感激。正如我所说,我在这个网站和其他网站上搜索了很多,接近但还不够接近。再次感谢!
您要做的是将一个 table 的值匹配到另一个 table,这可以通过 join
轻松完成。这通过一个公共(且同名)列匹配两个 table 的元素。
为此,您需要一个参考 table,其中每个不同的 class
都有其关联的 MajorClass
。 (我生成了一些虚拟数据)
#install.packages("dplyr")
library(dplyr)
test <- list(test14 = data.frame(class = c("201", "203","205"), total=c(1,3,7),
stringsAsFactors = F))
reference_table <- data.frame(class = c("201","202","203","204","205"),
MajorClass=c("Reg","Reg","NonReg","comercial","comercial"),
stringsAsFactors = F)
现在您可以使用 lapply
output.list <- lapply(test, function(x) left_join(x, reference_table, by="class"))
$test14
class total MajorClass
1 201 1 Reg
2 203 3 NonReg
3 205 7 comercial
或者将列表中的所有数据框合并为一个(如果它们具有相同的结构,则可以这样做)然后一次匹配所有 table。
data <- bind_rows(test)
output <- left_join(data, reference_table, by="class")
class total MajorClass
(chr) (dbl) (chr)
1 201 1 Reg
2 203 3 NonReg
3 205 7 comercial
我假设您有 Vicent Boned 描述的参考 table。您可以使用 base R 来完成这项工作。
test$MajorClass <- factor(test$class, levels=reference_table$class, labels=reference_table$MajorClass)