如何根据某些条件对R中的选定元素应用函数?

时间:2016-05-31 11:50:24

标签: r

我有一个包含user_idproduct_id的数据框A.我有另一个数据框B,其中包含product_idtags_id。每个产品都与一些标签相关联。我创建了一个矩阵C,其中包含所有用户的用户ID作为行名称和标记ID作为列名称,每个单元格最初都填充了零。我想要做的是遍历A的每一行并相应地填充C

例如 - 假设我在user_id = 001的第一行遇到product_id = 101A。现在,我在B中搜索与产品101关联的所有标签。让它们分别为201和202.当我在B中遇到标记时,我想在1的{​​{1}}行和tag_id_201 tag_id_202中增加user_id_001 {1}}。我希望在C中遇到的每一行都这样做。还应注意,在A中,A可以重复多次与不同的user_id相关联。

我可以应用嵌套for循环来实现这一点。

product_id

但嵌套循环的事情是他们在R中花了很多时间。是否有时间有效的方法呢?另外,我在if语句中收到错误(&#34; for(i in 1:nrow(A)) #Looping through every entry in A {for(j in 1:nrow(C))#Looping through every row in C to find the correct user_id {for(k in 1:nrow(B))#Looping through every row in B to find the appropriate tags for for a particular product {for(l in 1:ncol(C))#Looping through every column in C to find the relevant tag_id according to the tag_id in the upper loop {if((A$user_id[i] == rownames(C)[j])&(A$product_id[i] == B$product_id[k]) & (B$tag_id[k] == colnames(C)[l])) C[j, l] <- C[j, l] + 1 }}}} &#34;)。

修改:我上传了example

2 个答案:

答案 0 :(得分:1)

我认为您正在尝试在数据库语言中执行所谓的连接。在R中,您可以通过使用merge()

来实现
join<-merge(A,B,by="product_id")

这将返回一个包含两列的data.frame。 user_id中的第一列,第二列是tag_id。 (我认为product_id也作为第三列出现,但对于手头的问题并不重要。)

现在,使用此data.frame,您可以使用table()来计算每对(user_id,tag_id)出现此新data.frame的次数。

output<-table(join$user_id,join$tag_id)

那应该给你一个非常类似你所描述的矩阵C的矩阵。

答案 1 :(得分:0)

与@JMenezes一样,我建议使用import Events from 'react-native-simple-events'; export function login(email, password) { Events.trigger('LoginSuccess', 'response'); } import React, { Component, } from 'react' import { View, Text, } from 'react-native' import Events from 'react-native-simple-events'; import * as request from '../../network/ApiRequest' class LoginScreen extends Component { static propTypes = {} static defaultProps = {} constructor(props) { super(props) this.state = { status: "new" } } componentDidMount() { Events.on('LoginSuccess', 'myID', this.onLoginSuccess); request.login("abc","def") } componentWillUnmount() { Events.rm('LoginSuccess', 'myID'); } onLoginSuccess(data){ this.setState({ //=>error here status : "done" }); } render() { return ( <View> <Text> {this.state.status} </Text> </View> ) } } 。我写了一个小例子:

merge

编辑:我更改了答案以适合Ronnie Days示例(https://imgur.com/a/Uf9Tx)。之前设置tableA <- data.frame(user_id = c(1, 1, 1, 2, 2, 2), product_id = c(201, 202, 203, 201, 202, 210)) B <- data.frame(product_id = c(201, 201, 201, 202, 202, 202, 203, 203, 203, 210), tags_id = c(301, 302, 303, 301, 302, 309, 301, 309, 303, 303)) C <- matrix(NA, nrow = length(unique(A$user_id)), ncol = length(unique(B$tags_id))) rownames(C) <- unique(A$user_id) colnames(C) <- unique(B$tags_id) C <- as.data.frame(C) D <- merge(A, B) for(i in unique(A$user_id)){ tab <- table(subset(D, user_id == i)$tags_id) C[as.character(i), names(tab)] <- tab } 的代码是:

A