清理包含需要折叠的多个级别的因子的最有效(即有效/适当)方法是什么?也就是说,如何将两个或多个因子级别组合成一个.
这是一个示例,其中"是"和"Y"这两个级别应折叠为"是","否"和"N"折叠为"否":
## Given:
x <- c("Y", "Y", "Yes", "N", "No", "H") # The 'H' should be treated as NA
## expectedOutput
[1] Yes Yes Yes No No <NA>
Levels: Yes No # <~~ NOTICE ONLY **TWO** LEVELS
Run Code Online (Sandbox Code Playgroud)
一个选择当然是在手工使用sub和朋友之前清理琴弦.
另一种方法是允许重复标签,然后丢弃它们
## Duplicate levels ==> "Warning: deprecated"
x.f <- factor(x, levels=c("Y", "Yes", "No", "N"), labels=c("Yes", "Yes", "No", "No"))
## the above line can be wrapped in either of the next two lines
factor(x.f)
droplevels(x.f)
Run Code Online (Sandbox Code Playgroud)
但是,有更有效的方法吗?
虽然我知道levels …
只有素数因子为2,3或5的数字称为丑陋数字.
例:
1,2,3,4,5,6,8,9,10,12,15 ......
1可以被认为是2 ^ 0.
我正在努力寻找第n个难看的数字.请注意,当n变大时,这些数字非常稀疏地分布.
我写了一个简单的程序来计算给定数字是否丑陋.对于n> 500 - 它变得超级慢.我尝试使用memoization - 观察:ugly_number*2,ugly_number*3,ugly_number*5都很难看.即便如此,它也很慢.我尝试使用log的一些属性 - 因为这会将这个问题从乘法减少到另外 - 但是,运气不大.想与大家分享这个.任何有趣的想法?
使用类似于"Eratosthenes的筛子"的概念(感谢Anon)
for (int i(2), uglyCount(0); ; i++) {
if (i % 2 == 0)
continue;
if (i % 3 == 0)
continue;
if (i % 5 == 0)
continue;
uglyCount++;
if (uglyCount == n - 1)
break;
}
Run Code Online (Sandbox Code Playgroud)
我是第n个难看的数字.
即便这样也很慢.我想找到第1500个难看的数字.
可能重复:
使用R识别或编码唯一因子
我和R有点麻烦
我有一个类似于以下的数据集,但更长.
A B Pulse
1 2 23
2 2 24
2 2 12
2 3 25
1 1 65
1 3 45
Run Code Online (Sandbox Code Playgroud)
基本上,前两列是编码的.A有1,2表示2个不同的权重.
B有1,2,3代表3个不同的时间.
由于它们是编码数值,因此R将它们视为数值变量.我需要使用因子函数将这些变量转换为因子.
救命?
制作一个简单的筛子很容易:
for (int i=2; i<=N; i++){
if (sieve[i]==0){
cout << i << " is prime" << endl;
for (int j = i; j<=N; j+=i){
sieve[j]=1;
}
}
cout << i << " has " << sieve[i] << " distinct prime factors\n";
}
Run Code Online (Sandbox Code Playgroud)
但是当N非常大并且我无法在内存中保存那种数组时呢?我已经查找了分段筛选方法,它们似乎涉及到找到素数直到sqrt(N),但我不明白它是如何工作的.如果N非常大(例如10 ^ 18)怎么办?
algorithm primes sieve-of-eratosthenes prime-factoring factors
一个不可设置的函数的例子是labels.您只能在使用因子函数创建因子标签时设置它们.没有labels<-功能.不是因为'标签'和'水平'因素有任何意义....
> fac <- factor(1:3, labels=c("one", "two", "three"))
> fac
[1] one two three
Levels: one two three
> labels(fac)
[1] "1" "2" "3"
Run Code Online (Sandbox Code Playgroud)
好吧,我问过标签,人们可能认为这是由因子调用设定的,但是我得到了一些东西......这个词是什么,不直观?
> levels(fac)
[1] "one" "two" "three"
Run Code Online (Sandbox Code Playgroud)
所以看来设置标签确实是设置级别.
> fac <- factor(1:3, levels=c("one", "two", "three"))
> levels(fac)
[1] "one" "two" "three"
Run Code Online (Sandbox Code Playgroud)
好的,这是预期的.那么设置水平时标签是什么?
> fac <- factor(1:3, levels=c("one", "two", "three"), labels=c("x","y", "z") )
> labels(fac)
[1] "1" "2" "3"
> levels(fac)
[1] "x" "y" "z"
Run Code Online (Sandbox Code Playgroud)
如果你问我,会很奇怪.似乎因素的"标签"参数胜过级别规范的任何"级别"参数.为什么会这样?看起来像一个混乱的术语.为什么labels()返回我想象的用as.character(as.numeric(fac))检索的东西?
(这是一个切向评论[标记为]在早期的关于赋值函数的答案中,我被要求转移到一个问题.所以这是你有机会启发我.)
我有一个for循环,它检查一个数字是否是一个数字的因子,然后检查该因子是否为素数,然后将它添加到数组.根据原始号码,我会收到错误消息
致命错误:无法使用end <start形成范围
这几乎每次都会发生,但对于某些数字,它可以正常工作.我发现使用它的唯一数字是9,15和25.
这是代码:
let num = 16 // or any Int
var primes = [Int]()
for i in 2...(num/2) {
if ((num % i) == 0) {
var isPrimeFactor = true
for l in 2...i-1 {
if ((i%l) == 0) {
isPrimeFactor = false;
}//end if
}//end for
if (isPrimeFactor == true) {
primes.append(i)
}//end if
}//end if
}//end for
Run Code Online (Sandbox Code Playgroud) 我想做这个问题的反面,并且与这个问题相反,尽管这是关于传说,而不是情节本身.
其他SO问题似乎在询问如何保持未使用的因子水平.我实际上喜欢我的删除.我有几个名称变量和几个列(宽格式)的变量属性,我用它来创建多个条形图.这是一个可重复的例子:
library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5))
ggplot(df, aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
我明白了:

我只想在我的条形图中显示具有相应var n的名称(因为,B中没有空白空间).
如果我可以简单地更改输出文件名和y=var位,则重用基本绘图代码将非常容易.我希望不必对我的数据框进行子集,只是为了尽可能在每个绘图的结果上使用droplevels!
根据na.omit()建议更新
考虑修订的数据集:
library(ggplot2)
df <- data.frame(name=c("A","B","C"), var1=c(1,NA,2),var2=c(3,4,5), var3=c(NA,6,7))
ggplot(df, aes(x=name,y=var1)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
我需要na.omit()用于绘图,var1因为存在NA.但是由于na.omit确保所有列都存在值,因此该图A也会删除,因为它具有NA var3.这更类似于我的数据.我总共响应了15个NAs.我只想删除没有当前绘制的y向量值的因子级别,而不是在整个数据帧中的任何向量中都有NA .
我想找到一个数字的所有精确除数.目前我有这个:
{
int n;
int i=2;
scanf("%d",&n);
while(i<=n/2)
{
if(n%i==0)
printf("%d,",i);
i++;
}
getch();
}
Run Code Online (Sandbox Code Playgroud)
有没有办法改善它?
原始数据框:
v1 = sample(letters[1:3], 10, replace=TRUE)
v2 = sample(letters[1:3], 10, replace=TRUE)
df = data.frame(v1,v2)
df
Run Code Online (Sandbox Code Playgroud)
v1 v2 1 b c 2 a a 3 c c 4 b a 5 c c 6 c b 7 a a 8 a b 9 a c 10 a b
新数据框:
new_df = data.frame(row.names=rownames(df))
for (i in colnames(df)) {
for (x in letters[1:3]) {
#new_df[x] = as.numeric(df[i] == x)
new_df[paste0(i, "_", x)] = as.numeric(df[i] == x)
}
}
Run Code Online (Sandbox Code Playgroud)
v1_a v1_b v1_c v2_a v2_b …
我有一个数据框,其中一个特定列具有一组特定值(比方说,1,2,...,23).我想要做的是从这个布局转换为一个框架,其中框架将有额外的23(在这种情况下)列,每个列代表一个因子值.这些列中的数据将是布尔值,表示特定行是否具有给定的因子值...要显示特定示例:
来源框架:
ID DATE SECTOR
123 2008-01-01 1
456 2008-01-01 3
789 2008-01-02 5
... <more records with SECTOR values from 1 to 5>
Run Code Online (Sandbox Code Playgroud)
所需格式:
ID DATE SECTOR.1 SECTOR.2 SECTOR.3 SECTOR.4 SECTOR.5
123 2008-01-01 T F F F F
456 2008-01-01 F F T F F
789 2008-01-02 F F F F T
Run Code Online (Sandbox Code Playgroud)
我在循环中做这个没有问题,但我希望有更好的方法.到目前为止reshape()没有产生预期的结果.非常感谢帮助.