我有两个使用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
的建议
谢谢
答案 0 :(得分:2)
一个简单的merge
可以做到:
merge(a, b, by=c("x","y"))
默认情况下,merge
仅保留两个数据集中存在匹配项的行;您可以使用all
,all.x
和all.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