我的数据框有一些数值变量和一些分类factor变量.这些因素的等级顺序不是我希望它们的方式.
numbers <- 1:4
letters <- factor(c("a", "b", "c", "d"))
df <- data.frame(numbers, letters)
df
# numbers letters
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
Run Code Online (Sandbox Code Playgroud)
如果我更改了级别的顺序,则这些字母不再带有相应的数字(我的数据从这一点开始是完全无意义的).
levels(df$letters) <- c("d", "c", "b", "a")
df
# numbers letters
# 1 1 d
# 2 2 c
# 3 3 b
# 4 4 a
Run Code Online (Sandbox Code Playgroud)
我只想更改级别顺序,因此在绘图时,条形图按所需顺序显示 - 可能与默认的字母顺序不同.
在回答另一个问题时,@ Mayk发布了以下解决方案:https://stackoverflow.com/a/10432263/636656
dat <- structure(list(product = c(11L, 11L, 9L, 9L, 6L, 1L, 11L, 5L,
7L, 11L, 5L, 11L, 4L, 3L, 10L, 7L, 10L, 5L, 9L, 8L)), .Names = "product", row.names = c(NA, -20L), class = "data.frame")
`levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
Run Code Online (Sandbox Code Playgroud)
哪个产生输出:
[1] Generic Generic Bayer Bayer Advil Tylenol Generic Advil Bayer Generic Advil Generic Advil Tylenol
[15] Generic Bayer Generic Advil Bayer Bayer
Run Code Online (Sandbox Code Playgroud)
这只是矢量的打印输出,所以要存储它你可以做得更加困惑:
res <- `levels<-`(
factor(dat$product),
list(Tylenol=1:3, Advil=4:6, Bayer=7:9, Generic=10:12)
)
Run Code Online (Sandbox Code Playgroud)
显然这是对level函数的某种调用,但我不知道这里做了什么.这种巫术的术语是什么,我如何在这个领域增加我的魔法能力?
我想在我的条形图中绘制未使用的级别(即,计数为0的级别),但是,未使用的级别被删除,我无法弄清楚如何保留它们
df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df$type <- factor(df$type, levels=c("A","B", "C"))
ggplot(df, aes(x=group, fill=type)) + geom_bar()
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,我想看到C计数为0,但它完全没有...
感谢Ulrik的帮助
编辑:
这就是我想要的
df <- data.frame(type=c("A", "A", "A", "B", "B"), group=rep("group1", 5))
df1 <- data.frame(type=c("A", "A", "A", "B", "B", "A", "A", "C", "B", "B"), group=c(rep("group1", 5),rep("group2", 5)))
df$type <- factor(df$type, levels=c("A","B", "C"))
df1$type <- factor(df1$type, levels=c("A","B", "C"))
df <- data.frame(table(df))
df1 <- data.frame(table(df1))
ggplot(df, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge")
ggplot(df1, aes(x=group, y=Freq, fill=type)) + geom_bar(position="dodge")
Run Code Online (Sandbox Code Playgroud)
猜测解决方案是使用table()计算频率然后绘图
给出以下模拟数据:
set.seed(123)
x <- data.frame(let = sample(letters[1:5], 100, replace = T),
num = sample(1:10, 100, replace = T))
y <- subset(x, let != 'a')
Run Code Online (Sandbox Code Playgroud)
创建y$let收益表
a b c d e
0 20 21 22 18
Run Code Online (Sandbox Code Playgroud)
但我不想a再表现出来了.如果我尝试这样做:
levels(y$let) <- factor(y$let)
Run Code Online (Sandbox Code Playgroud)
我弄乱频率,因为现在table(y$let)给了我
b d c e
0 20 21 40
Run Code Online (Sandbox Code Playgroud)
我知道我可以做到xtabs(~ y$let, drop.unused.levels = T)并解决这个问题,但它并没有重置核心的变量级别(这对我很重要,因为这是我对数据集的一个早期改变,它将继续贯穿始终整个分析).而且,这xtabs是一个不同的类table,这将使我在项目后期头痛.
问题是:我如何自动更改,levels(y$let)以便它不显示创建子集时丢弃的级别?在这种情况下,我该如何展示[1] "b" "c" "d" "e"?
一个不可设置的函数的例子是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))检索的东西?
(这是一个切向评论[标记为]在早期的关于赋值函数的答案中,我被要求转移到一个问题.所以这是你有机会启发我.)
A有一个真正的问题(并且头疼)有一个任务......
我在一个入门编程课程中,我必须编写一个函数,给定一个列表,它将返回它所达到的"最大"深度...例如:[1,2,3]将返回1,[ 1,[2,3]]将返回2 ...
我写了这段代码(这是我能得到的最好的T_T)
def flat(l):
count=0
for item in l:
if isinstance(item,list):
count+= flat(item)
return count+1
Run Code Online (Sandbox Code Playgroud)
然而,它显然没有像它应该的那样工作,因为如果有列表不计入最大深度,它仍然提出反击......
例如:当我使用[1,2,[3,4],5,[6],7]的函数时,它应返回2,但它返回3 ...
任何想法或帮助将非常感谢^^非常感谢!! 我已经持续数星期了......
这是我的数据:
type<-rep(c(0,1),100)
diff<-rnorm(100)
data<-data.frame(type,diff)
Run Code Online (Sandbox Code Playgroud)
如果我想绘制历史图diff,我这样做:
hist(data$diff)
Run Code Online (Sandbox Code Playgroud)
但是我想要做什么来分割我的直方图type.我能做到这一点:
par(mfrow=c(1,2))
hist(data$diff[data$type==0])
hist(data$diff[data$type==1])
Run Code Online (Sandbox Code Playgroud)
但这给我的是两个不同的直方图.我想要做的就是生产出一个直方图diff的0一侧及diff的1,在另一侧.像这样的东西,条形连续,没有断裂或边界.这可能意味着轴将被分成两个因子.
也许这很简单,但我无法在网上找到答案.我按平均因素按平均计算有问题.我的数据看起来很典型:
factor, value
a,1
a,2
b,1
b,1
b,1
c,1
Run Code Online (Sandbox Code Playgroud)
我想得到向量A包含只有级别"a"的意思如果我在consol上键入A我想得到1.5而这种计算方法的方法,必须使用因子.
提前感谢您的帮助.
训练集
trainSample <- cbind(data[1:980,1], data[1:980,2]) cl <-
factor(c(data[1:980,3]))
Run Code Online (Sandbox Code Playgroud)
测试集
testSample <- data(data[981:1485,1], data[981:1485,2])
cl.test <- clknn
Run Code Online (Sandbox Code Playgroud)
预测
k <- knn(trainSample, testSample, cl, k = 5)
Run Code Online (Sandbox Code Playgroud)
产量
< k
[1] 2 2 1 1 1 1 2 1 2 1 1 2 2 2 2 2 1 1 2 2 2 2 2 2 2 2 2 2 2 1 2 2 1 1 2 2 1 1 2 2 2 2 1 2 2 2 2 2 2 1 2 …Run Code Online (Sandbox Code Playgroud) 我是R Programming的新手.我编写了一个示例程序,它返回矩阵中特定列的值.当我打印价值时,我会得到类似的东西
[1] APPLE
2 Levels : 1 2
Run Code Online (Sandbox Code Playgroud)
如何只获得没有输出中的级别的值.
提前致谢.