我有这样的问题:我想根据不同列中的最高值为每一行分配一个char值。我会试着更好地解释一下:
col1 col2 col3 col4
row1 10 20 30
row2 20 10 10
row3 30 10 10
我想将col4
作为因素分配给数据框的每一行的col1:col3间隔中具有最高值的列的名称。例如,row1
我希望col4
名称为“col3”,row2
名称为“col1”,依此类推。
使用dplyr或其他基本功能在R中有一种简单的方法吗?
答案 0 :(得分:3)
您实际上甚至不需要使用申请。你可以简单地完成一项任务:
package guru.springframework.controllers;
import guru.springframework.services.ProductService;
import org.hamcrest.Matchers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@WebMvcTest(ProductController.class)
public class ProductControllerTest {
@Autowired
private MockMvc mockMvc;
@MockBean
private ProductService productService;
@Test
public void testList() throws Exception {
mockMvc.perform(MockMvcRequestBuilders.get("/products"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.view().name("products"))
.andExpect(MockMvcResultMatchers.model().attributeExists("products"))
.andExpect(MockMvcResultMatchers.model().attribute("products",
Matchers.is(Matchers.empty())));
}
}
这也会处理您在领带问题中选择的列。为了说明这是如何工作的,我们可以稍微修改原始数据:
df$col4 <- names(df)[max.col(df,ties.method="first")]
注意第一行col2和col3的值是多少。根据您对使用字母顺序第一列的评论,我们需要col2。
运行上面的代码,我们看到它按预期工作:
df <-read.table(header=T,text=" col1 col2 col3
10 20 20
20 10 10
30 10 10")
修改:如果您的数据集中不仅有 col1 col2 col3 col4
1 10 20 20 col2
2 20 10 10 col1
3 30 10 10 col1
(可能还有其他变量,您不想占用最大值),那么更完整的解决方案将是指定要取最大值的列。像这样:
数据:的
cols1 - cols3
然后您可以运行代码以查看其工作原理:
#Note this has an extra id variable on it
df <-read.table(header=T,text=" col1 col2 col3 id
10 20 20 100
20 10 10 100
30 10 10 100")
答案 1 :(得分:0)
您可以使用which.max
和names
(或colnames
,如果这是一个矩阵)执行此操作:
# Data from example
dat <- data.frame(col1 = c(10, 20, 30), col2 = c(20, 10, 10), col3 = c(30, 10, 10))
dat$col4 <- apply(dat, 1, function(x) names(dat)[which.max(x)])