将函数应用于数据帧,并包括从第二个数据帧到第一个数据帧的一个新列,其大小在R中不同
我是R的新手,想知道做以下事情的最好方法是什么- 我的实际问题是一个多元回归模型,但它是一个相当大的数据集(>5000行和12列),因此我设计了一个类似的较短的问题。以下问题的解决方案可以复制以解决我的实际问题。如果您在以下方面有任何帮助(包括速度问题),我们将不胜感激- 我有以下两个数据帧-d1和d2将函数应用于数据帧,并包括从第二个数据帧到第一个数据帧的一个新列,其大小在R中不同,r,apply,R,Apply,我是R的新手,想知道做以下事情的最好方法是什么- 我的实际问题是一个多元回归模型,但它是一个相当大的数据集(>5000行和12列),因此我设计了一个类似的较短的问题。以下问题的解决方案可以复制以解决我的实际问题。如果您在以下方面有任何帮助(包括速度问题),我们将不胜感激- 我有以下两个数据帧-d1和d2 d1 - sno letter age 1 a 29 2 b 30 3 a 33 4 b 22 5
d1 -
sno letter age
1 a 29
2 b 30
3 a 33
4 b 22
5 c 25
d2-
letter marks
a 40
b 90
c 60
现在,我想使用Mark_代码计算a、b、c是否通过d2考试,然后将相应的成绩包含在d1中。所以我的最终输出应该是这样的-
d1 -
sno letter age grade
1 a 29 0
2 b 30 1
3 a 33 0
4 b 22 1
5 c 25 1
下面是我写的代码-(我没有得到我想要的结果!)
d1您应该为此使用ifelse
,因为与if
不同,它是矢量化的
d1 <- read.table(text=" sno letter age
1 a 29
2 b 30
3 a 33
4 b 22
5 c 25",header=TRUE)
d2 <- read.table(text=" letter marks
a 40
b 90
c 60",header=TRUE)
res <- merge(d1,d2)
res$grade <- ifelse(res$marks <= 40, 0, 1)
res <- res[order(res$sno),]
# letter sno age marks grade
# 1 a 1 29 40 0
# 3 b 2 30 90 1
# 2 a 3 33 40 0
# 4 b 4 22 90 1
# 5 c 5 25 60 1
d1这里有一种不同的方法:
d1$grade <-
as.numeric(sapply(d1$letter, FUN=function(z) d2[d2$letter==z,"marks"]>40))
使用数据。表:
require(data.table)
d1 <- as.data.table(d1)
d2 <- as.data.table(d2)
setkey(d1, "letter")
setkey(d2, "letter")
out <- d2[d1][, grade := (marks > 40) * 1]
setcolorder(out, c("letter", "sno", "age", "marks", "grade"))
# letter sno age marks grade
# 1: a 1 29 40 0
# 2: a 3 33 40 0
# 3: b 2 30 90 1
# 4: b 4 22 90 1
# 5: c 5 25 60 1
这使用了一个不必要的循环。是的,这是第一步。我添加了第二个版本。非常感谢!这是一种非常简洁的方法。我想对于实际问题我也可以这样做。
d1$grade <-
as.numeric(d2$marks[pmatch(d1$letter, d2$letter, duplicates.ok=TRUE)] > 40)
require(data.table)
d1 <- as.data.table(d1)
d2 <- as.data.table(d2)
setkey(d1, "letter")
setkey(d2, "letter")
out <- d2[d1][, grade := (marks > 40) * 1]
setcolorder(out, c("letter", "sno", "age", "marks", "grade"))
# letter sno age marks grade
# 1: a 1 29 40 0
# 2: a 3 33 40 0
# 3: b 2 30 90 1
# 4: b 4 22 90 1
# 5: c 5 25 60 1
setkey(out, "sno")