2016-07-30 72 views
-2

我有一组100个变量,从CFM_1到CFM_100。每个变量都可以取1,2,3或4中的任何值。我想创建一个名为TEMP的新变量,如果任何CFM_1到CFM_100变量的值为1或2,那么它将取值1。请帮助我解决此R编程 - 根据基于100个变量的值创建新变量

+0

我编辑根据您的意见我的回答。 – shayaa

+0

非常感谢你们的回答。特别是Shayaa。令人惊叹的。 –

+0

欢迎您点击答案附近的复选框,选择一个对您最有帮助的选项。 – shayaa

回答

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 

您可以通过应用任何功能,数据的行分配值的变量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)) 
+0

就概率评论而言,OP没有说变量是随机的。我们不知道这个数据集中值的分布。小于3的值可能非常罕见。 – rosscova

+0

@rosscova谢谢!我的意思是,“我的榜样”,而不是“你的榜样”,因为我随机抽样。无论如何,我想我提供了两种有效的方法。 – shayaa

+0

啊,我明白了,这是有道理的:)...是的,你的答案是非常有效的,特别是'dplyr',很好的工作。我正在尝试类似的东西,但无法使其工作。加一个给你。 – rosscova

1

用更有效的解决方案编辑适当的R代码,部分被盗/从@ shayaa的答案采购...

第一行这里只提取你感兴趣的列(创建一个临时数据帧我们将在完成后将其删除):

new <- subset(df, select = paste0("CFM_", seq_len(100))) 

df$TEMP <- 1 * (apply(new, 1, min) <= 2) 

rm(new) 

因此,您只需在每个整行中搜索指定的值,并将布尔结果转换为数字,并将其放置到原始数据框中。

+0

抱歉,我无法破译这个。如果可能的话,请详细解释一下。 CFM变量在哪里出现在这里? –

+0

对不起,我应该包括一个事实,即我假设您提到的“100个变量”是100列数据框中的列。我提供的代码查看所有列,因此不需要按名称调用列。如果有更多的列,你需要从计算中排除,代码会稍微改变。 – rosscova

+0

是的情况是我有大约300列的数据框,但我只对这些100列感兴趣。我明白你的解释。但是,如果我只想包含我感兴趣的语法,可以让我知道语法上的变化。非常感谢您的帮助。 –

相关问题