我有两个数据帧,很像这样:
data = data.frame(data=cbind(1:12,rep(c(1,2),6),rep(c(1,2,3),4)))
colnames(data)=c('v','h','c')
lookup = data.frame(data=cbind(c(rep(1,3),rep(2,3)),rep(c(1,2,3),2),21:26))
colnames(lookup)=c('h','c','t')
Run Code Online (Sandbox Code Playgroud)
我想从数据$ v中减去查找$ t,其中h和c列匹配.
我认为这样的事情会起作用
data$v-lookup$t[lookup$h==data$h&lookup$c==data$c]
Run Code Online (Sandbox Code Playgroud)
但并不神奇地知道我想隐式迭代数据行
我最终这样做了
myt = c()
for(i in 1:12) {
myt[i] = lookup$t[lookup$h==data$h[i]&lookup$c==data$c[i]]
}
Run Code Online (Sandbox Code Playgroud)
哪个工作正常,但我希望有人可以提出一个更合理的方式,不涉及循环.
我试图合并两个相当大的 - 但不是荒谬的(360,000 X 4,57,000 X 4) - 一个公共ID的数据集.我已经尝试了常规merge(),merge.data.table()和sqldf().每次我的内存耗尽(cannot allocate vector of size...).这有什么解决方案吗?或者R是合并数据的坏工具吗?head()给出如下(我想在STUDENT.NAME上合并):
ID10 STUDENT.NAME FATHER.NAME MOTHER.NAME
1 1 DEEKSHITH J JAYANNA SWARNA
2 4 MANIKANTHA D DEVARAJ MANJULA
3 5 NAGESH T THIMMAIAH N SHIVAMMA
4 6 NIZAMUDDIN R NOOR MOHAMMED BIBI
5 7 PRABHU YELLAPPA YELLAPPA MALLAMMA
6 8 SADDAM PASHA NISAR AHMED ZAREENA
Run Code Online (Sandbox Code Playgroud) 一直在使用SO作为我工作的资源.感谢您召集这样一个伟大的社区.
我正在尝试做一些有点复杂的事情,我现在能想到的唯一方法就是使用一对嵌套的for循环(我知道在R中不赞成)......我有三百万的记录 - 奇数课程注册:学生UserID与CourseID配对.在每一行中,都有一堆数据,包括开始/结束日期和分数等等.我需要做的是,对于每次注册,计算该用户在注册课程之前所参加的课程的平均分数.
我用于for循环的代码如下:
data$Mean.Prior.Score <- 0
for (i in as.numeric(rownames(data)) {
sum <- 0
count <- 0
for (j in as.numeric(rownames(data[data$UserID == data$UserID[i],]))) {
if (data$Course.End.Date[j] < data$Course.Start.Date[i]) {
sum <- sum + data$Score[j]
count <- count + 1
}
}
if (count != 0)
data$Mean.Prior.Score[i] <- sum / count
}
Run Code Online (Sandbox Code Playgroud)
我很确定这会起作用,但它的运行速度非常慢...我的数据框有超过三百万行,但经过10分钟的好处后,外部循环只运行了850条记录.这似乎比时间复杂性所暗示的要慢,特别是考虑到每个用户平均只有5或6个课程.
哦,我应该提一下,我在运行循环之前用as.POSIXct()转换了日期字符串,所以日期比较步骤不应该太慢......
必须有更好的方法来做到这一点...任何建议?
编辑:根据mnel的要求......终于得到dput了很好的发挥.不得不补充一下control = NULL.这是'tis:
structure(list(Username = structure(1:20, .Label = c("100225",
"100226", "100228", "1013170", "102876", "105796", "106753",
"106755", "108568", "109038", "110150", "110200", …Run Code Online (Sandbox Code Playgroud) 我有一个因素data frame与像水平hot,warm,tepid,cold,very cold,freezing.我想将它们映射到一个整数列,其值在[-2, 2]回归范围内,一些值映射到同一个东西.我希望能够指定显式映射,以便将very hot单词映射到2,将单词映射very cold到-2,等等.如何干净地执行此操作?我想要一个函数,我只是传递一些命名列表,或者其他什么.
什么是一种简单快捷的方法:
x <- list(a1=2, b1=c(1,2), c1=1:3)
y <- list(a2=5, b2=c(2,5), c2=2:4)
Run Code Online (Sandbox Code Playgroud)
至
list(list(x$a1, y$a2), list(x$b1, y$b2), list(x$c1, y$c2))
Run Code Online (Sandbox Code Playgroud)
?
或者一般来说:
如果列表x和y具有相同的长度并且它们的元素的长度也相应,那么如何将它组合成单个列表,如上所示?
我试图从我data.table的两行中的任何一个包含NA值的行中删除行.我想利用包中的J函数来利用二进制搜索data.table.这是我尝试过的:
DT = data.table(x=rep(c("a","b",NA),each=10), y=c(1,3,6))
setkey(DT,x)
DT
x y
1: NA 6
2: NA 1
3: NA 3
4: NA 6
5: NA 1
6: NA 3
7: NA 6
8: NA 1
9: NA 3
10: NA 6
11: a 1
12: a 3
13: a 6
14: a 1
15: a 3
16: a 6
17: a 1
18: a 3
19: a 6
20: a 1
21: b 3 …Run Code Online (Sandbox Code Playgroud) 假设我有两个表如下(数据取自这篇SO post):
桌子d1:
x start end
a 1 3
b 5 11
c 19 22
d 30 39
e 7 25
Run Code Online (Sandbox Code Playgroud)
桌子d2:
x pos
a 2
a 3
b 3
b 12
c 20
d 52
e 10
Run Code Online (Sandbox Code Playgroud)
两个表中的第一行都是列标题。我想提取d2列x与d1和列匹配pos1并落在其中(包括边界值)d1的所有行。也就是说,我想要的结果是:startend
x pos start end
a 2 1 3
a 3 1 3
c 20 19 22
e 10 7 25
Run Code Online (Sandbox Code Playgroud)
到目前为止我看到的这样做的方式是:
SELECT * …Run Code Online (Sandbox Code Playgroud) 我通常使用大型数据帧,这些数据帧排序很好(或者可以很容易地排序).
给定两个数据帧,两者都按'用户'排序
some.data <user> <data_1> <data_2>
user <user> <user_attr_1> <user_attr_2>
Run Code Online (Sandbox Code Playgroud)
我跑m = merge(some.data,user),我得到的结果如下:
m = <user> <data_1> <data_2> <user_attr_1> <user_attr_2>
Run Code Online (Sandbox Code Playgroud)
这很好.
但是merge没有利用这些数据帧在公共列上排序,使得合并相当漂亮的CPU /内存很重.但是,这个合并可以在O(n)中完成
我想知道在R中是否有办法对排序数据集进行有效合并?
我有一段代码,总耗时约为30秒,下面的代码大约是27秒.我将违规代码缩小到这个:
d$dis300[i] <- h
Run Code Online (Sandbox Code Playgroud)
所以我换到另一件,现在工作得非常快(正如预期的那样).
我的问题是为什么这对第二个太慢了.数据DF约为7500x18变量
第一:( 27秒过去了)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
d$dis300[i] <- h
}
Run Code Online (Sandbox Code Playgroud)
第二:(0.2秒过去了)
d$dis300 <- 0
for (i in 1:netot) {
h <- aaa[d$ent[i], d$dis[i]]
if (h == 0) writeLines(sprintf("ERROR. ent:%i dis:%i", d$ent[i], d$dis[i]))
foo[i] <- h
}
d$foo <- foo
Run Code Online (Sandbox Code Playgroud)
你可以看到两者都是"相同的",但有一个人有这个DF而不是一个向量.
任何评论都非常感谢.我来自另一种语言,这让我疯了一会儿.至少我有解决方案,但我希望将来能够防止这类问题.
谢谢你的时间,
如果我有这样的数据帧:
neu <- data.frame(test1 = c(1,2,3,4,5,6,7,8,9,10,11,12,13,14),
test2 = c("a","b","a","b","c","c","a","c","c","d","d","f","f","f"))
neu
test1 test2
1 1 a
2 2 b
3 3 a
4 4 b
5 5 c
6 6 c
7 7 a
8 8 c
9 9 c
10 10 d
11 11 d
12 12 f
13 13 f
14 14 f
Run Code Online (Sandbox Code Playgroud)
而且我想只选择那些因子水平test2出现超过三次的值,那么最快的方法是什么?
非常感谢,在之前的问题中没有找到正确的答案.