相关疑难解决方法(0)

检查数字是否为整数

我很惊讶地发现R没有附带一个方便的函数来检查数字是否为整数.

is.integer(66) # FALSE
Run Code Online (Sandbox Code Playgroud)

帮助文件警告:

is.integer(x)不测试是否x 包含整数!为此,请使用round,如is.wholenumber(x)示例中的函数 .

该示例将此自定义函数作为"解决方法"

is.wholenumber <- function(x, tol = .Machine$double.eps^0.5)  abs(x - round(x)) < tol
is.wholenumber(1) # is TRUE
Run Code Online (Sandbox Code Playgroud)

如果我必须编写一个函数来检查整数,假设我没有阅读上面的注释,我会编写一个函数,它会像

check.integer <- function(x) {
    x == round(x)
}
Run Code Online (Sandbox Code Playgroud)

我的方法会在哪里失败?如果你穿着我的假想鞋,你的工作会是什么?

integer r rounding

92
推荐指数
7
解决办法
11万
查看次数

if/while(condition){:参数的长度为零时出错

我收到了错误

Error in if (condition) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

要么

Error in while (condition) { : argument is of length zero
Run Code Online (Sandbox Code Playgroud)

是什么导致此错误消息,这是什么意思?

在进一步检查时,似乎价值是NULL.

condition
## NULL
Run Code Online (Sandbox Code Playgroud)

为了处理这个错误,我该如何测试NULL值?

我希望这会返回TRUE,但我得到一个空的逻辑值:

condition == NULL
## logical(0)
Run Code Online (Sandbox Code Playgroud)

r r-faq

32
推荐指数
3
解决办法
7万
查看次数

子集化data.frame中的NA会出现意外情况

请考虑以下代码.当您没有NA在您的条件中明确测试时,该代码将在以后失败,然后您的数据会发生变化.

>   # A toy example
>   a <- as.data.frame(cbind(col1=c(1,2,3,4),col2=c(2,NA,2,3),col3=c(1,2,3,4),col4=c(4,3,2,1)))
>   a
  col1 col2 col3 col4
1    1    2    1    4
2    2   NA    2    3
3    3    2    3    2
4    4    3    4    1
>   
>   # Bummer, there's an NA in my condition
>   a$col2==2
[1]  TRUE    NA  TRUE FALSE
> 
>   # Why is this a good thing to do?
>   # It NA'd the whole row, and kept it
>   a[a$col2==2,]
   col1 col2 …
Run Code Online (Sandbox Code Playgroud)

r

17
推荐指数
1
解决办法
3764
查看次数

为什么write.csv和read.csv不一致?

问题很简单,请考虑以下示例:

m <- head(iris)
write.csv(m, file = 'm.csv')
m1 <- read.csv('m.csv')
Run Code Online (Sandbox Code Playgroud)

其结果是m1与原始对象的不同之处m在于它具有名为"X"的新的第一列.如果我真的想让它们相等,我必须使用其他参数,就像在这两个例子中一样:

write.csv(m, file = 'm.csv', row.names = FALSE)
# and then
m1 <- read.csv('m.csv')
Run Code Online (Sandbox Code Playgroud)

要么

write.csv(m, file = 'm.csv')
m1 <- read.csv('m.csv', row.names = 1)
Run Code Online (Sandbox Code Playgroud)

问题是,这种差异的原因是什么?特别是,为什么如果write.csv并且read.csv本来打算坚持Excel约定,那么不要导入首先导出的同一个对象?对我来说,这是一种非常反直觉的行为,非常不受欢迎.

(如果我使用这些函数的csv2变体,这个结果会完全相同)

提前致谢!


这些是data.frames m,m1如果您不想使用R来查看示例:

> m
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1 …
Run Code Online (Sandbox Code Playgroud)

import export r export-to-csv read.table

11
推荐指数
1
解决办法
1276
查看次数

drop = TRUE不会降低data.frame中的因子级别,而它在向量中也是如此

drop = TRUEdata.frame过滤中有一个有趣的选项,参见摘录自help('[.data.frame'):

用法

类'data.frame'的S3方法

x[i, j, drop = ]
Run Code Online (Sandbox Code Playgroud)

但是当我在data.frame上尝试它时,它不起作用!

> df = data.frame(a = c("europe", "asia", "oceania"), b = c(1, 2, 3))
>
> df[1:2,, drop = TRUE]$a
[1] europe asia  
Levels: asia europe oceania     <--- oceania shouldn't be here!!
>
Run Code Online (Sandbox Code Playgroud)

我知道还有其他方法

df2 <- droplevels(df[1:2,])
Run Code Online (Sandbox Code Playgroud)

但文档承诺更优雅的方式来做到这一点,为什么它不起作用?这是一个错误吗?因为我不明白这是怎么一个功能......

编辑:我对drop = TRUE降低向量的因子水平感到困惑,你可以在这里看到.[i, drop = TRUE]降低因子水平并不是非常直观[i, j, drop = TRUE]!

r dataframe r-factor

7
推荐指数
3
解决办法
5190
查看次数

R:将列表项转换为对象

我有一个我手动创建的对象列表,如下所示:

rand1 <- rnorm(1e3)
rand2 <- rnorm(1e6)

myObjects <- NULL
myObjects[[1]] <-rand1
myObjects[[2]] <-rand2
names(myObjects) <- c("rand1","rand2")
Run Code Online (Sandbox Code Playgroud)

我正在研究捆绑对象的一些代码并将它们放在S3中.然后我在EC2中有代码,我想获取myObjects列表并自动"解包"它.在这个例子中,列表只有两个对象,名称是已知的,但我如何编码它来处理任何长度和任何名称的列表?

#pseudo code
for each thing in myObjects
  thing <- myObjects[[thing]]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何取名(myObjects)[1]并将其转换为一个对象的名称,我将为其分配myObjects [[1]]的内容.我可以处理循环,但创建每个对象有点让我挂起.我确信这很简单,但我不能理解它.

r list

6
推荐指数
3
解决办法
3642
查看次数

R舍入解释

任何人都可以解释为什么这会给出不同的输出?

round(1.49999999999999)
1


round(1.4999999999999999)
2
Run Code Online (Sandbox Code Playgroud)

我已经阅读了圆形文档,但它没有提到它的任何内容.我知道R代表二进制形式的数字,但为什么增加两个额外的9会改变结果呢?

谢谢.

r

5
推荐指数
1
解决办法
485
查看次数

R中的平均值和手动计算之间的差异?

我在R中编写一个简单函数来计算两个输入数字之间的百分比差异.

pdiff <-function(a,b) 
    {
      if(length(a>=1)) a <- median(a)
      if(length(b>=1)) b <- median(b)
      (abs(a-b)/((a+b)/2))*100
    }

    pdiffa <-function(a,b)
    {
      if(length(a>=1)) a <- median(a)
      if(length(b>=1)) b <- median(b)
      (abs(a-b)/mean(a,b))*100
    }
Run Code Online (Sandbox Code Playgroud)

当您使用随机值a和b运行它时,函数会给出不同的结果

x <- 5
y <- 10
pdiff(x,y) #gives 66%
pdiffa(x,y) #gives 100%
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

当我进入代码时,显然(x + y)/ 2 = 7.5和mean(x,y)= 5的值不同......我错过了一些非常明显和愚蠢的东西吗?

在此输入图像描述

math r

4
推荐指数
2
解决办法
228
查看次数

As.vector不会将data.frame子集转换为vector

下面我提供了一些我一直在研究的代码片段.我已成功读取字符串作为表格.我希望使用中位数()函数存在我的表的一些子集.根据我所做的研究和我自己的经验,median()没有为data.frame定义行为,也没有定义data.frame的子集.因此,为了使我的问题适合某些定义的行为,我试图将我想要的子集投射到矢量中.但是,即使使用as.vector投射我想要的子集,我仍然有一个data.frame.当我尝试调用中位数时,我得到"参数不是数字或逻辑:返回NA".

我自己玩了很多,并试图在这里和其他地方找到信息.作为一个注释,我已经尝试了在这个线程R-friendly方式上的重复解决方案中列出的方法将R data.frame列转换为向量?并取得了与现在相同的结果.我不太关心我是如何做到这一点的; 随意提出其他方法.

感谢您的时间.

for(i in 1:length(text_array)){
    temp= read.table(textConnection(text_array[i]), sep="\t",row.names=NULL, header= FALSE,  fill=TRUE) 
    value=""
    #we are now going to process temp and add it
    cur_DS=coll_data_sets[i]
    #median is the value that we are going to insert into the result array.
    #currently the logic behind it is not implemented.
    #the value will be the median of state1 divided by the median of state2.
    t_states=vector(length=ncol(temp))
    for(j in 1:ncol(temp)){
        t_states[j]=toString(temp[2,j])

    }
    t_states=(unique(t_states))
    #this logic is current is set to …
Run Code Online (Sandbox Code Playgroud)

casting r vector dataframe

3
推荐指数
1
解决办法
3011
查看次数

为什么any()在没有真值时返回NA

所以我们有这种行为:

any(c(TRUE, FALSE, NA))
#> [1] TRUE
any(c(TRUE, NA))
#> [1] TRUE
any(c(FALSE, NA))
#> [1] NA
Run Code Online (Sandbox Code Playgroud)

有人知道返回NA而不是FALSE的理由吗?IMO该函数应该测试是否存在非FALSE值,NA不是.

r

3
推荐指数
2
解决办法
776
查看次数

'x'必须是数字向量:来自data.frame数字的错误

我在文件/表中的两列上运行cor.test.

tmp <- read.table(files_to_test[i], header=TRUE, sep="\t")
## Obtain Columns To Compare ##
colA <-tmp[compareA]
colB <-tmp[compareB]
# sctr = 'spearman cor.test result'
sctr <- cor.test(colA, colB, alternative="two.sided", method="spearman")
Run Code Online (Sandbox Code Playgroud)

但我得到了这个令人困惑的错误......

Error in cor.test.default(colA, colB, alternative = "two.sided", method = "spearman") : 
'x' must be a numeric vector
Run Code Online (Sandbox Code Playgroud)

列中的值是数字但是

is.numeric(colA) = FALSE 
class (colA) = data.frame
Run Code Online (Sandbox Code Playgroud)

我错过了什么?

r dataframe

2
推荐指数
1
解决办法
4万
查看次数

了解&&运算符何时短路

也许我错过了一些明显的东西.

在R中,TRUE && NAevalues到NA.这对我来说没有意义,因为&&应该从左到右进行评估,并在其中一个条件成立时立即停止.

r short-circuiting

1
推荐指数
1
解决办法
1902
查看次数