我很惊讶地发现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)
我的方法会在哪里失败?如果你穿着我的假想鞋,你的工作会是什么?
我收到了错误
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) 请考虑以下代码.当您没有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) 问题很简单,请考虑以下示例:
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) drop = TRUEdata.frame过滤中有一个有趣的选项,参见摘录自help('[.data.frame'):
用法
类'data.frame'的S3方法
Run Code Online (Sandbox Code Playgroud)x[i, j, drop = ]
但是当我在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]!
我有一个我手动创建的对象列表,如下所示:
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]]的内容.我可以处理循环,但创建每个对象有点让我挂起.我确信这很简单,但我不能理解它.
任何人都可以解释为什么这会给出不同的输出?
round(1.49999999999999)
1
round(1.4999999999999999)
2
Run Code Online (Sandbox Code Playgroud)
我已经阅读了圆形文档,但它没有提到它的任何内容.我知道R代表二进制形式的数字,但为什么增加两个额外的9会改变结果呢?
谢谢.
我在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的值不同......我错过了一些非常明显和愚蠢的东西吗?
下面我提供了一些我一直在研究的代码片段.我已成功读取字符串作为表格.我希望使用中位数()函数存在我的表的一些子集.根据我所做的研究和我自己的经验,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) 所以我们有这种行为:
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不是.
我在文件/表中的两列上运行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中,TRUE && NAevalues到NA.这对我来说没有意义,因为&&应该从左到右进行评估,并在其中一个条件成立时立即停止.