我无法理解逻辑(布尔)值的属性TRUE,FALSE以及NA与逻辑OR(|)和逻辑AND(&)一起使用时.这里有些例子:
NA | TRUE
# [1] TRUE
NA | FALSE
# [1] NA
NA & TRUE
# [1] NA
NA & FALSE
# [1] FALSE
Run Code Online (Sandbox Code Playgroud)
你能解释一下这些输出吗?
我有以下数据:
Name <- c("Sam", "Sarah", "Jim", "Fred", "James", "Sally", "Andrew", "John", "Mairin", "Kate", "Sasha", "Ray", "Ed")
Age <- c(22,12,31,35,58,82,17,34,12,24,44,67,43)
Group <- c("A", "B", "B", "B", "B", "C", "C", "D", "D", "D", "D", "D", "D")
data <- data.frame(Name, Age, Group)
Run Code Online (Sandbox Code Playgroud)
我想用dplyr来
(1)按"组"分组数据(2)显示每组内的最小和最大年龄(3)显示最小和最大年龄的人的姓名
以下代码执行此操作:
data %>% group_by(Group) %>%
summarize(minAge = min(Age), minAgeName = Name[which(Age == min(Age))],
maxAge = max(Age), maxAgeName = Name[which(Age == max(Age))])
Run Code Online (Sandbox Code Playgroud)
哪个效果很好:
Group minAge minAgeName maxAge maxAgeName
1 A 22 Sam 22 Sam
2 B 12 Sarah 58 James …Run Code Online (Sandbox Code Playgroud) 在dplyr中,我想排除包含单词"junk"的列,但是,可能没有任何列包含单词"junk".在这种情况下,dplyr应该返回所有列.但它没有返回.请参阅下面的单元测试用例
df<-data.frame(name=paste("name",1:5), age=1:5)
str(df)
# 'data.frame': 5 obs. of 2 variables:
# $ name: Factor w/ 5 levels "name 1","name 2",..: 1 2 3 4 5
# $ age : int 1 2 3 4 5
df1<-df%>%select(-contains("junk"))
str(df1)
# 'data.frame': 5 obs. of 0 variables
Run Code Online (Sandbox Code Playgroud)
我哪里错了?
我有一个data.table,列有一个NAs.我想删除该列占用特定值的行(恰好是这样"").但是,我的第一次尝试也导致我丢失了NAs 行:
> a = c(1,"",NA)
> x <- data.table(a);x
a
1: 1
2:
3: NA
> y <- x[a!=""];y
a
1: 1
Run Code Online (Sandbox Code Playgroud)
看了之后?`!=`,我找到了一个有效的衬垫,但这很痛苦:
> z <- x[!sapply(a,function(x)identical(x,""))]; z
a
1: 1
2: NA
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法来做到这一点?此外,我认为没有好的方法来扩展它以排除多个非NA值.这是一个糟糕的方式:
> drop_these <- function(these,where){
+ argh <- !sapply(where,
+ function(x)unlist(lapply(as.list(these),function(this)identical(x,this)))
+ )
+ if (is.matrix(argh)){argh <- apply(argh,2,all)}
+ return(argh)
+ }
> x[drop_these("",a)]
a
1: 1
2: NA
> x[drop_these(c(1,""),a)]
a
1: NA
Run Code Online (Sandbox Code Playgroud)
我查看?J …
数据结构是:
Company Marital
a single
a married
b widow
c married
b single
Run Code Online (Sandbox Code Playgroud)
我正在使用table(df$Company,df$Marital),但我希望有一个显示行总数的列,如下所示:
a b c Total
married 50 20 5 75
single 10 10 10 30
widow 5 50 0 55
Run Code Online (Sandbox Code Playgroud)
是否有不同的表函数提供行和附加选项?
我想捕获第一场比赛,NA如果没有比赛则返回.
regexpr("a+", c("abc", "def", "cba a", "aa"), perl=TRUE)
# [1] 1 -1 3 1
# attr(,"match.length")
# [1] 1 -1 1 2
x <- c("abc", "def", "cba a", "aa")
m <- regexpr("a+", x, perl=TRUE)
regmatches(x, m)
# [1] "a" "a" "aa"
Run Code Online (Sandbox Code Playgroud)
所以我期待"a",NA,"a","aa"
我一直在寻找我认为简单解决方案的高低.
我有一个大的数据框架,我按因素分开.
eqRegions <- split(eqDataAll, eqDataAll$SeismicRegion)
现在,这将按区域创建数据框的列表对象; 共有8个.我想循环遍历列表,使用另一个名称制作单独的数据框.
我可以执行以下操作将列表项转换为单独的数据帧,但我认为如果我有很多因素,有一个循环机制很快.
testRegion1 <- eqRegions[[1]]
testRegion3 <- eqRegions[[3]]
我可以手动执行上面的操作并且很好地处理它,但是如果我有很多区域则效率不高.我想做的是相当于以下内容:
for (i in 1:length(eqRegions)) {
region[i] <- as.data.frame(eqRegions[[i]])
}
Run Code Online (Sandbox Code Playgroud)
我认为关键是在循环之前定义区域,但它会自行覆盖而不是递增.非常感谢.
考虑(如果rstudio)将在浏览器中打开某些内容的功能,如果y = TRUE在浏览器中和浏览器中y = FALSE.您可以强制whatever在浏览器中打开options(viewer = NULL)(然后需要重置为之前),但我无法使用常规on.exit方法在函数内部使用它.在Windows和osx上测试.
f <- function(x, y = TRUE) {
if (y) {
oo <- getOption('viewer')
on.exit(options(viewer = oo))
options(viewer = NULL)
} else options(viewer = NULL)
print(getOption('viewer'))
DT::datatable(x)
}
g <- function(x, y = TRUE) {
if (y) {
oo <- getOption('viewer')
on.exit(options(viewer = oo))
options(viewer = NULL)
} else options(viewer = NULL)
print(getOption('viewer'))
htmlTable::htmlTable(x)
}
## in rstudio, returns the viewer function
getOption('viewer')
# …Run Code Online (Sandbox Code Playgroud) 我试图计算多个列的中值,但我的数据有点时髦.它看起来像下面的例子.
library(data.table)
dt <- data.table("ID" = c(1,2,3,4),"none" = c(0,5,5,3),
"ten" = c(3,2,5,4),"twenty" = c(0,2,3,1))
ID none ten twenty
1: 1 0 3 0
2: 2 5 2 2
3: 3 5 5 3
4: 4 3 4 1
Run Code Online (Sandbox Code Playgroud)
在表中,列表示该值的出现次数.我想计算中位数.
例如,对于ID = 1
median(c(10, 10, 10))
Run Code Online (Sandbox Code Playgroud)
是我想要创建的计算.
对于ID = 2
median(c(0, 0, 0, 0, 0, 10, 10, 20, 20))
Run Code Online (Sandbox Code Playgroud)
我尝试过使用rep()并lapply()取得了非常有限的成功,并且已经就如何实现这一目标提供了明确的指导.我理解为喜欢rep()我将不得不硬编码我的价值重复(例如rep(0,2)或rep(10,2)),这是我所期望的.我正在努力创建一个包含每列重复的列表或向量.
当我跑...
library(data.table)
DT = CJ(id = 1, id2 = 1:3)[, .(
d = as.IDate("2017-01-01")+1:10, v = id*10 + id2*1:10
), by=.(id, id2)]
plotDT = DT[, {
par(mfrow = c(uniqueN(id2), 1), mar = c(2,2,.5,2))
.SD[,{
plot(d, v, type="l")
}, by=id2]
.(p = .(recordPlot()))
}, by=id]
x11()
plotDT[id == 1L, replayPlot(p[[1]])]
Run Code Online (Sandbox Code Playgroud)
情节DT[...]是正确的:

虽然重播是错误的:

在recordedplot中,最终的值x和y神奇地应用于所有三个图,可能是因为data.table处理指向by=组中定义的列的指针.
我不确定我是否理解发生了什么,因为我可以在表面上改变这个例子,写作v = id2*1:10而不是v = id*10 + id2*1:10- 噗 - 问题消失了.
我想知道(i)为什么会发生这种情况,以及(ii)我可以通过什么简单的调整来解决这个问题?