R编程 - 从基于100个变量的值创建新变量

时间:2016-07-30 06:24:30

标签: r analytics

我从CFM_1到CFM_100设置了100个变量。每个变量都可以取1,2,3或4中的任何值。我想创建一个名为TEMP的新变量,如果任何CFM_1到CFM_100变量的值为1或2,它将取值1.请帮我一个适当的R代码

2 个答案:

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