我有两个数据框如下:
test1 <- structure(list(`0.62m` = c(0.011, 0.043, 0.057, 0.067, 0.095,
0.121, 0.098, 0.086, 0.103, 0.12, 0.104), `0.87m` = c(0.017,
0.018, 0.052, 0.062, 0.111, 0.101, 0.112, 0.096, 0.104, 0.108,
0.111), `1.12m` = c(0.009, 0.016, 0.048, 0.03, 0.085, 0.07, 0.108,
0.076, 0.078, 0.092, 0.107), `1.37m` = c(0.025, 0.035, 0.035,
0.048, 0.067, 0.074, 0.095, 0.08, 0.082, 0.091, 0.094)), .Names = c("0.62m",
"0.87m", "1.12m", "1.37m"), row.names = 25:35, class = c("tbl_df",
"tbl", "data.frame"))
#Test 2
test2 <- structure(list(`0.62m` = c(235.15, 230.95, 251.95, 261.25, 254.55,
251.75, 259.85, 257.65, 252.55, 255.55, 254.15), `0.87m` = c(287.95,
196.35, 275.05, 245.85, 253.35, 259.75, 254.95, 261.75, 253.05,
264.45, 264.25), `1.12m` = c(36.35, 242.95, 266.65, 266.45, 248.85,
256.95, 253.75, 268.25, 251.05, 268.85, 259.65), `1.37m` = c(20.65,
287.95, 260.25, 260.55, 255.25, 258.45, 248.45, 261.95, 253.45,
263.25, 252.05)), .Names = c("0.62m", "0.87m", "1.12m", "1.37m"
), row.names = 25:35, class = c("tbl_df", "tbl", "data.frame"
))
测试1如下所示:
0.62m 0.87m 1.12m 1.37m
25 0.011 0.017 0.009 0.025
26 0.043 0.018 0.016 0.035
27 0.057 0.052 0.048 0.035
28 0.067 0.062 0.030 0.048
29 0.095 0.111 0.085 0.067
30 0.121 0.101 0.070 0.074
31 0.098 0.112 0.108 0.095
32 0.086 0.096 0.076 0.080
33 0.103 0.104 0.078 0.082
34 0.120 0.108 0.092 0.091
35 0.104 0.111 0.107 0.094
测试2如下所示:
0.62m 0.87m 1.12m 1.37m
25 235.15 287.95 36.35 20.65
26 230.95 196.35 242.95 287.95
27 251.95 275.05 266.65 260.25
28 261.25 245.85 266.45 260.55
29 254.55 253.35 248.85 255.25
30 251.75 259.75 256.95 258.45
31 259.85 254.95 253.75 248.45
32 257.65 261.75 268.25 261.95
33 252.55 253.05 251.05 253.45
34 255.55 264.45 268.85 263.25
35 254.15 264.25 259.65 252.05
现在,我想创建一个新的数据帧test3,我需要检查test2中的值是否大于180。如果该值大于180,则元素应与test1相同,否则应为-1 * test1。
所需的输出如下所示:
0.62m 0.87m 1.12m 1.37m
25 0.011 0.017 -0.009 -0.025
26 0.043 0.018 0.016 0.035
我试过以下:
test3 <- ifelse(test2 > 180, test1, -1 * test1)
另一种方法:
test3 <- data.frame(sapply(X = test1, FUN = function(x) (ifelse(test2>180, x, - 1*x))))
我想我需要使用apply但不确定如何正确使用它。
答案 0 :(得分:4)
您只需要进行一些as.matrix()
次调用(请注意,只有顶行中最右侧的两个单元格实际上小于180):
ifelse(as.matrix(test2)>180,as.matrix(test1),-as.matrix(test1));
## 0.62m 0.87m 1.12m 1.37m
## 25 0.011 0.017 -0.009 -0.025
## 26 0.043 0.018 0.016 0.035
## 27 0.057 0.052 0.048 0.035
## 28 0.067 0.062 0.030 0.048
## 29 0.095 0.111 0.085 0.067
## 30 0.121 0.101 0.070 0.074
## 31 0.098 0.112 0.108 0.095
## 32 0.086 0.096 0.076 0.080
## 33 0.103 0.104 0.078 0.082
## 34 0.120 0.108 0.092 0.091
## 35 0.104 0.111 0.107 0.094
返回值将是一个矩阵,但您可以通过as.data.frame()
返回data.frame(如果需要)。
答案 1 :(得分:4)
你可以尝试
test1*((test2<=180) *-1+ (test2>180))
# 0.62m 0.87m 1.12m 1.37m
#25 0.011 0.017 -0.009 -0.025
#26 0.043 0.018 0.016 0.035
#27 0.057 0.052 0.048 0.035
#28 0.067 0.062 0.030 0.048
#29 0.095 0.111 0.085 0.067
#30 0.121 0.101 0.070 0.074
#31 0.098 0.112 0.108 0.095
#32 0.086 0.096 0.076 0.080
#33 0.103 0.104 0.078 0.082
#34 0.120 0.108 0.092 0.091
#35 0.104 0.111 0.107 0.094
@Marat Talipov建议的更优雅的选项(在评论中)
test1*((test2>180)*2-1)
答案 2 :(得分:4)
另一种解决方案可能是(期望的结果将存储在test1
)
indx <- test2 <= 180
test1[indx] <- -test1[indx]