使用R

时间:2018-09-10 03:16:35

标签: r data.table

我有两个使用R的data.tables(a和b),每个约10,000行。每个data.table包含三列x,y和z。 z值在每个data.table中都是唯一的。每个data.table共享许多相同的x和y值。我需要做的是创建一个新的data.table(c),其中仅包含来自a的行,其中x和y值与b中的值相同。

这是我需要实现的示例。

数据表a

x    y      z
a    1    100
a    6    120
c    5    234
b    3    567
d    8    645
f    7    487

数据表b

x    y     z
a    1    904
b    6    120
c    7    765
e    3    567
d    8    329
a    0    638

数据表c(新创建的数据表)应如下图所示

x    y     z
a    1    100
d    8    645

我已经看过这里(Matching values between data frames based on overlapping dates),但是并没有完全把我带到需要的地方。

下面是生成示例data.tables的代码。

library(data.table)

x<-c("a","a","c","b","d","f")
y<-c(1,6,5,3,8,7)
z<-c(100,120,234,567,645,487)
a<-data.frame(x,y,z)
rm(x,y,z)

x<-c("a","b","c","e","d","a")
y<-c(1,6,7,3,8,0)
z<-c(904,120,765,567,329,638)
b<-data.frame(x,y,z)

setDT(a)
setDT(b)

很高兴接受使用传统data.frames的建议

谢谢

3 个答案:

答案 0 :(得分:2)

一个简单的merge可以做到:

merge(a, b, by=c("x","y"))

默认情况下,merge仅保留两个数据集中存在匹配项的行;您可以使用allall.xall.y参数来更改此行为,但是这里不需要这样做。

如果您不希望数据表z中的b值,请执行以下操作:

merge(a, b[,.(x,y)], by=c("x","y"))

答案 1 :(得分:0)

尝试:

# Note that they should be different values of z for identical x and y
# The following options assume that you also want to keep this information i.e. z values 
# from a and b for matched columns x and y
dplyr::inner_join(a, b, by = c("x", "y")) # option 1
merge(a, b, by = c("x","y")) # option 2
# option 3 using DT
setkeyv(a, c("x","y"))
setkeyv(b, c("x","y"))
a[b, nomatch = 0]

答案 2 :(得分:0)

或者,一种import math import numpy as np lista1=[1,3] def von_mises(sigma_A, sigma_B, tao_XY): print("Las unidades de los valores ingresados se encuentran en kpsi") print("Ingresar el valor del esfuerzo en X:\n") sigma_A = input() #Input regresa una cadena de caracteres, no valores numéricos sigma_A = int(sigma_A) print("Ingresar el valor del esfuerzo en Y:\n") sigma_B = input() sigma_B = int(sigma_B) print("Ingresar el valor del esfuerzo cortante Tao:\n") tao_XY = input() tao_XY = int(tao_XY) sigma_von = math.sqrt((pow(sigma_A, 2))-(sigma_A*sigma_B)+(pow(sigma_B, 2))+(3*(pow(tao_XY, 2)))) lista1 = np.array([sigma_von, sigma_A, sigma_B]) return lista1 #para simplificar el llamado de los valores que arroja esta función def ED(res_ced, lista1): print("Ingresar el valor de la resistencia a la cedencia:\n") res_ced = input() res_ced = int(res_ced) n_ED = res_ced/lista1[0] #se invoca a la función de von mises para simplificar print("El factor de seguridad ED es:") print(n_ED) def ECM(lista1, res_ced): if ((lista1[1] >= lista1[2]) and (lista1[2] >= 0)): n_ECM = res_ced/lista1[1] elif ((lista1[1] >= 0) and (lista1[2] <= 0)): n_ECM = res_ced/(lista1[1]-lista1[2]) else: n_ECM = res_ced/(-lista1[2]) print("El factor de seguridad ECM es:") print(n_ECM) #MAIN res_ced=0 tao_XY=0 sigma_A=0 sigma_B=0 ED(res_ced,von_mises(sigma_A, sigma_B, tao_XY)) ECM(lista1, res_ced) 方法:

dplyr