我从CFM_1到CFM_100设置了100个变量。每个变量都可以取1,2,3或4中的任何值。我想创建一个名为TEMP的新变量,如果任何CFM_1到CFM_100变量的值为1或2,它将取值1.请帮我一个适当的R代码
答案 0 :(得分:1)
使用更有效的解决方案编辑,部分是从@ shayaa的回答中窃取/购买的......
此处的第一行通过仅提取您感兴趣的列来创建临时数据框(我们在完成此操作后将其删除):
new <- subset( df, select = paste0( "CFM_", seq_len( 100 ) ) )
df$TEMP <- 1 * ( apply( new, 1, min ) <= 2 )
rm( new )
因此,您只需搜索每一行指定的任一值,并将布尔结果转换为数字,并将其放入原始数据框中。
答案 1 :(得分:1)
我的例子有点傻,因为随机变量在这个矩阵中的单个位置产生1或2的几率是1/2。这样做十次,矩阵的每一列一次,并且对于任何给定的行,您的临时变量为TRUE的可能性不到1%。无论如何,这里也是。
df <- data.frame(replicate(5, sample(1:4, 10, replace = TRUE)))
names(df) <- paste("CFM", 1:ncol(df), sep = "_")
您的数据框架如下所示
df
CFM_1 CFM_2 CFM_3 CFM_4 CFM_5
1 2 2 1 4 4
2 2 2 1 3 4
3 2 1 1 3 3
4 1 2 3 3 2
5 3 4 2 4 4
6 3 4 4 2 2
7 3 1 3 2 2
8 1 2 4 1 2
9 3 2 1 3 2
10 1 3 1 4 3
现在假设您要在数据框中包含其他要排除的变量。我们将使用cbind将这些列前置并附加到数据框中,如下所示。
df <- cbind(replicate(3,sample(1:4, 10, replace = T)),
df,
replicate(3,sample(1:4, 10, replace = T)))
names(df)[1:3]<- paste0("Var",1:3)
names(df)[9:11] <- paste0("Var", 9:11)
现在你的df看起来像这样
df
Var1 Var2 Var3 CFM_1 CFM_2 CFM_3 CFM_4 CFM_5 Var9 Var10 Var11
1 4 1 4 4 1 3 1 3 1 3 1
2 4 2 3 2 4 3 2 1 2 3 3
3 4 2 4 4 2 1 1 2 2 3 2
4 4 4 2 4 4 1 3 2 2 1 2
5 4 2 1 4 4 4 1 1 2 2 2
6 1 4 2 3 1 4 4 2 1 3 2
7 3 2 4 4 2 3 4 3 1 1 1
8 1 3 3 3 3 2 3 3 2 2 2
9 3 3 2 1 4 3 4 1 4 2 1
10 2 1 1 2 1 2 4 1 2 1 1
您可以通过将any函数应用于数据行来将值分配给变量temp,以检查每行中的任何数据是1还是2。但首先您需要找出哪些列是你的数据。
您可以使用agrep
函数执行近似字符串匹配。如果您使用
"CFM"
cfm_cols <-agrep("CFM", names(df))
cfm_cols
[1] 4 5 6 7 8
temp <- apply(df[,cfm_cols], 1, function(x) any(x) %in% c(1,2))
temp
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE
正如所料,它们都是TRUE
。
如果您愿意,另一种解决方案是使用dplyr
库进行此
library(dplyr)
df%>% rowwise() %>% select(contains("CFM")) %>%
mutate(TEMP = any(.) %in% c(1,2))