我有一个data.frame,它显示水质与土地利用参数之间的相关性。在这个data.frame中,您有列xName、yName、corr和p.value。然而,在列xName中,yName并不是一个单独的专栏,仅仅是为了质量和单独使用。
例如,我只想要xName栏中的水质数据,yName栏中只有土地利用数据,因为顺序不会改变corr和p.value的值。
最初,我考虑用mutate创建新列,其中显示xName和yName是否是土地使用和水质,然后使用case_when和recode转换可能的名称。
但是我无法继续前进,因为它返回一个错误并且不更改名称。
df=read.table(text="xName yName corr p.value classe_tipox2 classe_tipoy2
IQA_mean soil 0.639727697 0.025073852 water land
OD_mean veg 0.60989011 0.03029001 water land
OD_mean grass -0.576923077 0.042537186 water land
soil N_Total_mean 0.604577823 0.037305053 land water
crop N_Total_mean 0.695600561 0.012007646 land water
crop P_Total_mean -0.624544589 0.029931227 land water
DBO_mean veg 0.797202797 0.003161252 water land
DBO_mean city 0.756757445 0.004382975 water land
DBO_mean grass -0.825174825 0.001718596 water land
veg P_Total_mean -0.587412587 0.048844858 land water
P_Total_mean grass 0.629370629 0.03239475 water land", sep="", header=TRUE)%>%
#change names positions
mutate(xName=case_when(
classe_tipox2=='land' & classe_tipoy2=='water' ~ recode(xName=yName )
))我希望当xName是土地使用类型时,xName被重命名为yName。
发布于 2021-12-22 22:31:54
另一种选择(虽然有点冗长)。首先,我将数据放入长格式,然后使用ifelse语句“修复”xName和yName,然后将数据转回宽格式。
library(tidyverse)
df %>%
pivot_longer(c(xName, yName)) %>%
mutate(
name = ifelse(
name == "xName" &
classe_tipox2 == 'land',
"yName",
ifelse(
name == "yName" &
classe_tipox2 == 'land',
"xName",
name
)
)
) %>%
pivot_wider(names_from = name, values_from = value) %>%
select(5:6, 1:4) %>%
mutate(classe_tipox2 = "water", classe_tipoy2 = "land")输出
# A tibble: 11 × 6
xName yName corr p.value classe_tipox2 classe_tipoy2
<chr> <chr> <dbl> <dbl> <chr> <chr>
1 IQA_mean soil 0.640 0.0251 water land
2 OD_mean veg 0.610 0.0303 water land
3 OD_mean grass -0.577 0.0425 water land
4 N_Total_mean soil 0.605 0.0373 water land
5 N_Total_mean crop 0.696 0.0120 water land
6 P_Total_mean crop -0.625 0.0299 water land
7 DBO_mean veg 0.797 0.00316 water land
8 DBO_mean city 0.757 0.00438 water land
9 DBO_mean grass -0.825 0.00172 water land
10 P_Total_mean veg -0.587 0.0488 water land
11 P_Total_mean grass 0.629 0.0324 water land 发布于 2021-12-23 00:13:03
一种基R方法
# get the conditional logic
chose <- df$classe_tipox2 == "land"
# then select the columns and bind with the rest of the data
cbind(setNames(data.frame(t(sapply(seq_along(chose), function(x)
'if'(chose[x], c(df$yName[x],df$xName[x]), c(df$xName[x],df$yName[x]))))),
colnames(df[,1:2])), df[,-c(1,2)])
xName yName corr p.value classe_tipox2 classe_tipoy2
1 IQA_mean soil 0.6397277 0.025073852 water land
2 OD_mean veg 0.6098901 0.030290010 water land
3 OD_mean grass -0.5769231 0.042537186 water land
4 N_Total_mean soil 0.6045778 0.037305053 land water
5 N_Total_mean crop 0.6956006 0.012007646 land water
6 P_Total_mean crop -0.6245446 0.029931227 land water
7 DBO_mean veg 0.7972028 0.003161252 water land
8 DBO_mean city 0.7567574 0.004382975 water land
9 DBO_mean grass -0.8251748 0.001718596 water land
10 P_Total_mean veg -0.5874126 0.048844858 land water
11 P_Total_mean grass 0.6293706 0.032394750 water landhttps://stackoverflow.com/questions/70455446
复制相似问题