我有一个包含一列字符串的数据框,并希望将这些字符串的子字符串提取到一个新列中.
下面是一些示例代码和数据,显示我想在id列中的最后一个下划线字符后面获取字符串以创建new_id列.该id列条目总是有2个下划线它总是最后子,我想.
df = data.frame( id = I(c("abcd_123_ABC","abc_5234_NHYK")), x = c(1.0,2.0) )
require(dplyr)
df = df %>% dplyr::mutate(new_id = strsplit(id, split="_")[[1]][3])
Run Code Online (Sandbox Code Playgroud)
我期待strsplit依次对每一行采取行动.
但是,该new_id列仅包含ABC在每一行中,而我想ABC在第1行和NHYK第2行中包含.您是否知道为什么会失败以及如何实现我想要的?
我无法理解 dplyr 的 top_n 函数的输出。有人可以帮忙吗?
n=10
df = data.frame(ref=sample(letters,n),score=rnorm(n))
require(dplyr)
print(dplyr::top_n(df,5,score))
print(df[order(df$score,decreasing = T)[1:5],])
Run Code Online (Sandbox Code Playgroud)
的输出top_n没有按照我预期的分数排序。与使用order函数比较
参考分数 1 我 0.71556494 2 p 0.04463846 3 v 0.37290990 4 克 1.53206194 5 f 0.86307107 参考分数 7 克 1.53206194 10 英尺 0.86307107 1 我 0.71556494 6 v 0.37290990 4 p 0.04463846
我读过的文档也暗示top_n结果应该按指定的列排序,例如
https://www.rstudio.com/wp-content/uploads/2015/02/data-wrangling-cheatsheet.pdf
下面的代码使用R / ggplot
set.seed(123)
require(ggplot2)
n <- 60
df <- data.frame(theta=sample(180,n,replace=TRUE),
gp=sample(c("A","B"),n,replace=TRUE ))
p <- ggplot(df)
p <- p + geom_histogram(aes(x=theta,fill=gp),
binwidth=5)
p <- p + scale_x_continuous(breaks=seq(0,360,30),
limits=c(0,360))
p <- p + coord_polar(theta="x", start=3*pi/2, direction=-1)
p <- p + theme_bw()
print(p)
Run Code Online (Sandbox Code Playgroud)
我只想显示角度范围[0,180],并完全排除该范围(180,360),所以该图基本上是上半圆而不是整个圆。
更改scale_x_continuous中的限制不会执行此操作。有办法吗?谢谢。
编辑有一个类似的问题,但是这里有一个不同的包 使用圆形包创建了一个极坐标图(玫瑰图)的一半
我想按某些列和子集订购多列数据框,但使用的命令不起作用
print(df[order(df$x) & df$x < 5,])
Run Code Online (Sandbox Code Playgroud)
这不会对结果进行排序。
为了调试它,我生成了一个带有 1 列的测试数据框,但是这种“简化”产生了意想不到的效果
df <- data.frame(x = sample(1:50))
print(df[order(df$x) & df$x < 5,])
Run Code Online (Sandbox Code Playgroud)
这不会对结果进行排序,所以我觉得我已经重现了问题,但使用了更简单的数据。
将过程分解为先排序然后子集让我发现这种情况下的排序不会生成数据帧对象
df <- data.frame(x = sample(1:50))
ndf <- df[order(df$x),]
print(class(ndf))
Run Code Online (Sandbox Code Playgroud)
产生
[1] "integer"
Run Code Online (Sandbox Code Playgroud)
尝试使用数据帧语法对结果“整数”ndf 对象进行子集化,例如
print(ndf[ndf$x < 5, ])
Run Code Online (Sandbox Code Playgroud)
显然会产生一个错误:
Error in ndf$x : $ operator is invalid for atomic vectors.
Run Code Online (Sandbox Code Playgroud)
进一步简化,我发现单独的子集化(不应用 order 函数)不会生成数据帧对象
ndf <- df[df$x < 5,]
class(ndf)
[1] "integer"
Run Code Online (Sandbox Code Playgroud)
事实证明,分离排序和子集的多列数据框确实按预期工作
df <- data.frame(x = sample(1:50), y = rnorm(50))
ndf <- df[order(df$x),]
print(ndf[ndf$x < 5, ])
Run Code Online (Sandbox Code Playgroud)
这解决了我原来的问题,但又引出了两个问题: …