使用rbind创建数据帧是行不通的

时间:2013-10-28 10:53:46

标签: r dataframe rbind

我正在尝试编写一个脚本来获取等式25a + 20b = 1600的某些特定值,其中a在24:60到b之间的范围是20:50

我需要得到满足等式的a和b对。

我的第一个问题是如何使用单个数字小数位(a = 24.0,24.1,24.2 ......等)定义a和b但我克服了定义a<-c(240:600)/10的问题,所以我的第一个问题是:有没有直接的方法呢?

现在,我做了几个嵌套循环,每次在向量中满足等式时我都能得到,我想用rbind()将这个向量附加到矩阵或数据帧但是它不起作用没有任何错误或警告。它只取第一个向量的值,就是它!

这是我的代码,有人可以帮我定义问题所在吗?

solve_ms <- function() {  
  index<-1  
  sol<-data.frame()  
  temp<-vector("numeric")  
  a<-c(240:600)/10  
  b<-c(200:500)/10  

 for (i in 1:length(a)){   
    for (j in 1:length(b)) {   
      c <- 25*a[i]+20*b[j]  
      if(c == 1600) {  
        temp<-c(a[i], b[j]) 
        if(index == 1) {  
          sol<-temp 
          index<-0  
        }  
        else   rbind(sol,temp)  
      }  
     }  
   }  

 return(sol)  
}

我发现我的代码问题在哪里,它使用rbind而不将其返回分配给数据帧。我不得不做{sol&lt; -rbind(sol,temp)},它会起作用。 我也会检查其他建议..谢谢。

2 个答案:

答案 0 :(得分:2)

请改为尝试:

#define a function
fun <- function(a,b) (25*a+20*b) == 1600

由于浮点精度可能是一个问题:

#alternative function
fun <- function(a,b,tol=.Machine$double.eps ^ 0.5) abs(25*a+20*b-1600) < tol

#create all possible combinations
paras <- expand.grid(a=c(240:600)/10, b=20:50)
paras[fun(paras$a,paras$b),]

         a  b
241   48.0 20
594   47.2 21
947   46.4 22
1300  45.6 23
1653  44.8 24
2006  44.0 25
2359  43.2 26
2712  42.4 27
3065  41.6 28
3418  40.8 29
3771  40.0 30
4124  39.2 31
4477  38.4 32
4830  37.6 33
5183  36.8 34
5536  36.0 35
5889  35.2 36
6242  34.4 37
6595  33.6 38
6948  32.8 39
7301  32.0 40
7654  31.2 41
8007  30.4 42
8360  29.6 43
8713  28.8 44
9066  28.0 45
9419  27.2 46
9772  26.4 47
10125 25.6 48
10478 24.8 49
10831 24.0 50

答案 1 :(得分:1)

如果问题真的很简单,即求解2变量线性方程的根,你可以随时重新排列方程式,用a b = (1600-25*a)/20来表示b,得到b的所有值对于a的对应值,并按b

过滤组合

e.g。

a = c(240:600)/10
b = 20:50

RESULTS <- data.frame(a, b = (1600 - 25 * a)/20)[((1600 - 25 * a)/20) %in% b, ]
RESULTS
##        a  b
## 1   24.0 50
## 9   24.8 49
## 17  25.6 48
## 25  26.4 47
## 33  27.2 46
## 41  28.0 45
## 49  28.8 44
## 57  29.6 43
## 65  30.4 42
## 73  31.2 41
## 81  32.0 40
## 97  33.6 38
## 105 34.4 37
## 121 36.0 35
## 137 37.6 33
## 145 38.4 32
## 161 40.0 30
## 177 41.6 28
## 185 42.4 27
## 193 43.2 26
## 201 44.0 25
## 209 44.8 24
## 217 45.6 23
## 225 46.4 22
## 233 47.2 21
## 241 48.0 20