我有一个数据框,我想添加一个包含不重复的字母数字值的列.
首先,我改编了一个我在博客上找到的功能.(https://ryouready.wordpress.com/2008/12/18/generate-random-string-name/)
idGenerator <- function(n, lengthId) {
alphaNum <- c(0:9, letters, LETTERS)
if (n > length(alphaNum)^lengthId) {
return("Error! n > perms : Infinite loop")
}
idList <- rep(NULL, n)
for (i in 1:n) {
idList[i] <- paste(sample(alphaNum,
lengthId, replace = TRUE), collapse = "")
while(idList[i] %in% idList[-i]) {
idList[i] <- paste(sample(alphaNum,
lengthId, replace = TRUE), collapse = "")
}
}
return(idList)
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我的数据帧有大约250k行,所以n = 250k这个函数只是永远运行.我知道n = 250k,如果我增加id字符串的长度(lengthId)获得相同字符串的几率是不现实的,所以while循环是浪费资源,但我真的需要确保不会发生,我对控制结构意味着"肯定".
所以我发现了一种更有效的方法,而不是调用while并检查i循环中每个的所有向量,我检查最终向量中是否有重复:
idGenerator <- …Run Code Online (Sandbox Code Playgroud) 我想格式化数字,以便每千个应该用空格分隔.
我尝试过的:
library(magrittr)
addSpaceSep <- function(x) {
x %>%
as.character %>%
strsplit(split = NULL) %>%
unlist %>%
rev %>%
split(ceiling(seq_along(.) / 3)) %>%
lapply(paste, collapse = "") %>%
paste(collapse = " ") %>%
strsplit(split = NULL) %>%
unlist %>%
rev %>%
paste(collapse = "")
}
> sapply(c(1, 12, 123, 1234, 12345, 123456, 123456, 1234567), addSpaceSep)
[1] "1" "12" "123" "1 234" "12 345" "123 456" "123 456"
[8] "1 234 567"
> sapply(c(1, 10, 100, 1000, 10000, 100000, 1000000), addSpaceSep) …Run Code Online (Sandbox Code Playgroud) 我有以下数据:
data <- data.frame(x = letters[1:6],
group = rep(letters[1:2], each = 3),
y = 1:6)
x group y
1 a a 1
2 b a 2
3 c a 3
4 d b 4
5 e b 5
6 f b 6
Run Code Online (Sandbox Code Playgroud)
我想用y ~ xggplot2 绘制并按组分成多个方面。
ggplot(data, aes(x, y)) +
geom_bar(stat = "identity") +
facet_grid(group ~ .)
Run Code Online (Sandbox Code Playgroud)
问题是(x; group)我的数据中不存在某些元组(例如 ) 没有数据x = a && group = b,但它们保留在两个方面的 x 轴中,因此我想删除它们,然后删除方面中的空白当各个组中缺少因素时。
我以为scales = "free_x" or …
我试图在html页面上添加iframe,我意识到当我通过HTTP协议加载我的HTML文件时(例如在地址:localhost/file.html),只有带有"http://localhost.."URL的文件才会显示在iframe中.
网站网址或本地文件(使用访问"file:///C:/...")在iframe中不返回任何内容(甚至没有"未找到"或其他错误).
同样,当我使用file协议(然后是网址file:///C:/UwAmp/www/file.html)打开我的文件时,网站的网址仍然无法在iframe中工作(但是本地文件加载file或http不是问题).
为什么在使用HTTP(S)协议加载的页面中忽略与"file:///"的链接?为什么我不能在我的iframe中显示网站?
感谢您的帮助.(抱歉我的英语,我尽力解释).
我想生成两个日期之间所有月份的序列。
我可以用 seq.Date 来实现这一点:
start <- as.Date("2015-08-01")
end <- as.Date("2015-09-01")
seq <- seq.Date(start, end, by = "month")
[1] "2015-08-01" "2015-09-01"
format(seq, "%Y-%m")
[1] "2015-08" "2015-09"
Run Code Online (Sandbox Code Playgroud)
但如果两个日期之间相隔不到一个月,则会失败:
start <- as.Date("2015-08-14")
end <- as.Date("2015-09-03")
seq <- seq.Date(start, end, by = "month")
[1] "2015-08-14"
format(seq, "%Y-%m")
[1] "2015-08"
Run Code Online (Sandbox Code Playgroud)
我可以用 seq 解决几天的问题:
unique(format(seq.Date(start, end, by = "day"), "%Y-%m"))
[1] "2015-08" "2015-09"
Run Code Online (Sandbox Code Playgroud)
但有没有一种更简单的方法来做到这一点,我缺少什么?谢谢。
我有一个2列的混合类型,矢量和数据框列表.
> my.list
$a
[1] 1
$df1
key value
1 b 2
2 c 3
$df2
key value
1 d 4
2 e 5
Run Code Online (Sandbox Code Playgroud)
我想最后得到一个向量列表,每个数据帧行将成为一个列表元素,列值为value,列键为元素名称.
所以这个例子的结果是:
$a
[1] 1
$b
[1] 2
$c
[1] 3
$d
[1] 4
$e
[1] 5
Run Code Online (Sandbox Code Playgroud)
其实这就是我如何做到这一点:
my.list <- list(a = 1,
df1 = data.frame(key = c("b", "c"), value = 2:3),
df2 = data.frame(key = c("d", "e"), value = 4:5))
unlist(lapply(seq_along(my.list), function(i) {
if (is.data.frame(my.list[[i]])) {
with(my.list[[i]], as.list(setNames(value, key), all.names = TRUE))
} else { …Run Code Online (Sandbox Code Playgroud) 我想创建一个函数来将值映射到组,以及不同的变量.
df <- data.frame(x = c("a", "a", "b", "c", "c", "d", "e"),
y = c(1, 5, 5, 1, 6, 8, 3),
z = runif(7),
stringsAsFactors = FALSE)
Run Code Online (Sandbox Code Playgroud)
例如,对于这些数据,对于变量x,我想将值"a","b"映射到"label1",将"c""d""e"映射到"label2",并且对于变量y map 1, 3成"code1",5,6,8成"code2".
groups <- list(x = list(label1 = c("a", "b"), label2 = c("c", "d", "e")),
y = list(code1 = c(1, 3), code2 = c(5, 6, 8)))
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我想要映射来自2个变量的值,但它可以是1,3,4 ......所以我不想为每个变量创建数据帧查找或逐个分配每个变量.这就是为什么我使用一个列表(我在函数参数中发现它更友好)并且不能使用$.+这是在函数内部使用,所以我不需要硬编码.
所以实际上我创建了这个函数:
f <- function(x, groups) {
table <- reshape2::melt(groups)
table <- split(table, table$L1)
for (i in seq_along(table)) {
x[names(table)[i]] <- table[[i]]$L2[match(x[,names(table)[i]], table[[i]]$value)]
} …Run Code Online (Sandbox Code Playgroud) 我想将两个不同长度列表的值“粘贴”在一起
例如我有那些清单
x = [1, 2, 3, 4]
y = ['a', 'b', 'c']
Run Code Online (Sandbox Code Playgroud)
所以期望的输出是:
['a1', 'a2', 'a3', 'a4', 'b1', 'b2', 'b3', 'b4', 'c1', 'c2', 'c3', 'c4']
我找到了一种方法来实现它:
li = []
for yy in y :
li += list(map(lambda xx : yy + str(xx), x))
Run Code Online (Sandbox Code Playgroud)
但我不确定这是否是 Python 的方式,或者它是否真的很好。
还有更好的选择吗?谢谢